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

Saa*_*age 1 c++ memory-management set c++11

请考虑以下代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

其中第二个循环对从集合中取出元素的顺序敏感.在程序的不同运行中,这种程序的执行结果是否可能会有所不同?

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

Pla*_*aHH 5

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

这里定义的实现有两件事:

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

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