gpt4 book ai didi

C++:初始化成员数据时的奇怪行为

转载 作者:行者123 更新时间:2023-12-01 21:17:38 26 4
gpt4 key购买 nike

我遇到了关于 C++17 静态内联成员数据 的奇怪行为。
Implementation 抽象类:

class Implementation
{
public:
virtual void call() = 0;
};

有实现抽象类的 ExampleAnotherExample 类:

class Example : public Implementation
{
public:
void call() override
{
cout << "Called Example::call function!" << endl;
}
};

class AnotherExample : public Implementation
{
public:
void call() override
{
cout << "Called AnotherExample::call function!" << endl;
}
};

最后有 Implementer 类来使用 ExampleAnotherExample 类:

class Implementer
{
private:
static inline Implementation* example = unique_ptr<Example>(new Example).get(); // or make_unique<Example>().get()
static inline Implementation* another_example = new AnotherExample;
public:
static Implementation* get_example(bool flag)
{
// This function returns example object if flag is true otherwise another_example object.
if (flag)
return example;
else
return another_example;
}
};

使用:

Implementer::get_example(true)->call(); // This expect to return example.
Implementer::get_example(false)->call(); // This expect to return another_example.

我们希望看到这样的情况:

Called Example::call function!
Called AnotherExample::call function!

但是我们看到了这个:

Called AnotherExample::call function!
Called AnotherExample::call function!

我不明白。 example 对象如何获取 another_example 对象的值?

编辑:如果我们进行更改,我们可以获得所需的输出

static inline Implementation* example = unique_ptr<Example>(new Example).get();

static inline unique_ptr<Implementation> example = unique_ptr<Example>(new Example);

最佳答案

unique_ptr<Example>(new Example).get()会破坏新的Example实例一旦 get() 的结果被分配(感谢@JVApen 的更正)。

从那时起,可能会发生很多奇怪的事情。

例如new AnotherExample分配的对象可以(而且很可能会)被放置到第一个指针所在的同一内存中,并且第一个指针会突然再次指向一个有效的事件对象。

不确定这是否符合 ABA 的条件现象,但发生的情况非常相似 - 你认为你正在看 A,但它是一个不同的 A。

我首先在 Valgrind 下清理它或ASAN .

Coliru 沙箱 here

关于C++:初始化成员数据时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61155767/

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