gpt4 book ai didi

c++ - 再现随机 std::set 顺序

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:46:38 27 4
gpt4 key购买 nike

我有一个随机失败的测试,我怀疑是由于 std::set 中对象的顺序是按指针值排序的。但是,在我当前的 exe 上,测试总是通过。有没有一种方法可以“混合”指针创建,以便我的集合中对象的顺序在两次运行之间不同?

换句话说,对于给定的 C++ 代码,指针的“排序顺序”(p1 < p2) 是否是确定的,或者不同的编译或不同的运行是否可以有不同的排序顺序?

例如,在此代码中,在创建 p1 和 p2 之间添加“p1b.reset(nullptr)”将反转 p1/p2 的“排序顺序”。有没有其他方法可以在不更改源代码的情况下影响此顺序?

int main(void)
{
std::unique_ptr< MyClass > p1b(new MyClass());

//Lot of code, with memory allocated/deallocated

std::unique_ptr< MyClass > p1(new MyClass());

//p1b.reset(nullptr);

//Lot of code, with memory allocated/deallocated

std::unique_ptr< MyClass > p2(new MyClass());

std::cout << "p1: " << p1.get() << std::endl;
std::cout << "p2: " << p2.get() << std::endl;
}

给予:

p1: 0x171c030
p2: 0x171c050

注释掉“p1b.reset(nullptr)”:

p1: 0x21f9030
p2: 0x21f9010

最佳答案

编辑 2:根据您的编辑:https://stackoverflow.com/revisions/37027675/3

In other words, is the "sorted order" (p1 < p2) of pointers deterministic for a given C++ code, or does different compilations or different runs can have different sorted orders ?

是的,它们可以有不同的顺序,因为 - 当您在堆上分配时,不能保证内存分配器返回的指针地址的“连续顺序”,所以,是的,它可以随时更改。阅读答案的剩余部分。


编辑 1:根据您的编辑:https://stackoverflow.com/revisions/37027675/2

For example in this code, adding p1b.reset(nullptr) between p1 and p2 creation will invert p1 / p2 order. Is there any other way to influence this order ?

不,它不会“颠倒”创建顺序,您销毁了p1并创建另一个对象(可能相等)并用它代替 p1 .阅读最初的答案..


初始答案

Is there a way I can "mix" the pointers creations so the order of object in my set is different between two runs ?

很有可能,您的内存分配器以连续的方式分配内存,因此如果您在单线程程序中连续分配元素,它们很可能位于连续的内存地址中。但如果是关于绝对指针地址,由于 Address space layout randomization,它们可能在程序的每次运行中处于“不同”的绝对偏移量。

如果您希望连续元素的内存地址是随机的,或者以特定顺序,您将不得不以随机方式或简单地按照您希望它创建的顺序创建它...

对于一个随机的时尚...... ...在我的脑海中:也许,生成一个std::vector您要创建的对象的索引;随机化(或随机化)vector然后遍历创建对象的 vector 元素。


我上面的回答是基于你所说的怀疑。但同样,我对此感到不舒服:

I have a test randomly failing, I suspect due to order of objects in a std::set ordered on pointers values. However, on my current exe, the test always passes.

检查 Undefined Behaviors并通过您的代码运行内存工具和静态分析器。

关于c++ - 再现随机 std::set<T*> 顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37027675/

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