gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 00:36:46 25 4
gpt4 key购买 nike

考虑以下代码:

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com