c++ - 存储一组指针会导致未定义的行为吗?

标签 c++ memory-management c++11 set

考虑以下代码:

#include <iostream>

int main(int argc, char ** argv) {

  std::set<int*> ints;

  for (int i = 0; i < 10; i ++) {
    int * k = new int(i);
    ints.insert(k);
  }

  for (auto i : ints) {
    // some order-sensitive operations, for example:
    std::cout << (*i) << " ";
  }

  return 0;
}

第二个循环对从集合中获取元素的顺序敏感。有没有可能这样的程序在不同的运行过程中,执行的结果会有所不同?

据我所知,std::set 在内部对元素进行排序。由于内存中的分配不一定具有递增地址,因此该程序的输出可能(尽管不太可能)不是 0 1 2 3 4 5 6 7 8 9?

最佳答案

是的,它们可能不同,但不会因为 UB 而不同。

这里定义了两件事:

  • 方式std::less<int*>进行排序(尽管在大多数实现中您会看到“自然”排序)
  • operator new 返回的地址每次可能相同也可能不同。这很可能会因您的实现使用的分配器而异,并且两种方式(确定性和看似随机的)都已在野外看到。 (请注意,当您通过例如 valgrind 运行程序时,顺序可能仍然始终相同,但与本地运行时不同)。

因此,不要依赖于您感兴趣的任何特定顺序。

关于c++ - 存储一组指针会导致未定义的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15086954/

相关文章:

C++快捷方式,就地初始化数组参数

c++ - gcc 确保没有编译任何 c++ isms?

memory-management - 每个自定义 GCD 队列都需要 ARC 下的自动释放池吗?

powershell - 将可用内存输出为单个值(以兆字节为单位)

c++ - 在读/写中使用 C++11 unordered_map 的最有效方法

c++ - 计数器变量 : how does it work?

c++ - 如何避免 'implicit' 在 std::pair 中调用单参数构造函数

c++ - 引用计数智能指针引用计数如何工作?

c++ - 我们如何用 "using"替换这个 typedef?

c++ - 命名空间名称在范围内必须是唯一的。为什么?