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?
是的,它们可能不同,但不会因为UB而不同.
这里定义的实现有两件事:
std::less<int*>顺序的方式(虽然在大多数实现中你会看到"自然"排序)operator new每次返回的地址可能相同也可能不同.这很可能会因您的实现使用的分配器而异,并且两种方式(确定性的和看似随机的)都是在野外看到的.(请注意,当您通过例如valgrind运行程序时,顺序可能仍然始终相同,但与本机运行时不同).因此,请不要依赖于您感兴趣的任何特定顺序.