gpt4 book ai didi

c++ - 当 key 是涉及虚拟继承的基类指针时,访问 std::unordered_map 项会崩溃

转载 作者:行者123 更新时间:2023-12-01 14:40:06 26 4
gpt4 key购买 nike

以下代码适用于 g++,但使用 MSVC 编译时会崩溃。我不知道我的代码是否有未定义的行为或其他什么。最小示例:

class C1
{
};

// without virtual, it works.
// I need virtual because there is a C3 that inherits from C1,
// and then C4 that inherits from C2 and C3
class C2 : virtual public C1
{
public:
std::function<void()> f;
};

std::unordered_map<C1*, int> uMap;
//std::unordered_map<C2*, int> uMap; // doesn't crash

C2* f1()
{
C2* o = new C2;
o->f = [&]()
{
std::cout << uMap[o] << '\n'; // MSVC: 0xC0000005: Access violation reading location
};
return o;
}

int main()
{
auto o = f1();
o->f();
delete o;
}

最佳答案

C2* f1()
{
C2* o = new C2;
o->f = [&]()
{
std::cout << uMap[o] << '\n'; // MSVC: 0xC0000005: Access violation reading location
};
return o;
}

此代码的问题在于 lambda 通过引用捕获局部变量 o。当函数f1()返回时,o的作用域不再存在。所以你有一个悬空的引用!因此,当您调用 lambda 时,您会得到未定义的行为。两个版本的 map 都会发生这种情况。

要解决这个问题,您可以通过值捕获:

o->f = [=]()
{
std::cout << uMap[o] << '\n';
};

此处指针由 lambda 复制,在函数返回后有效。

关于c++ - 当 key 是涉及虚拟继承的基类指针时,访问 std::unordered_map 项会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59440972/

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