gpt4 book ai didi

c++ - 如何将 std::vector 用于带句柄的类

转载 作者:太空狗 更新时间:2023-10-29 20:01:38 26 4
gpt4 key购买 nike

我已经定义了以下女巫创建和释放不透明对象(例如操作系统句柄)的类

class A
{
public:

A(...)
{
allocateHandle(&h);
}

~A()
{
freeHandle(h);
}

SomeHandle h;
}

创建和调整 A 的 std::vector 时,程序崩溃。

std::vector<A> vec;
vec.reserve(2);

vec.emplace_back(...);
vec.emplace_back(...);
vec.emplace_back(...); //crash

当 std::vector 重新分配内存时,它会调用所有对象的移动构造函数,因此也会移动 A 中的句柄(基本上是一个整数)。

然而,它也调用了旧对象的析构函数,它调用了 freeHandle(),因此它释放了句柄后面的内存,新对象仍然有,它变得无效并导致崩溃。

我应该如何实现移动构造函数,以便在删除旧对象时新创建的对象不会变得无效?

最佳答案

您需要为您的对象添加一些“没有持有有效句柄”状态。如果你的SomeHandle已经有一个“无效句柄”值(通常使用 0),您可以使用它:

class A
{
public:

A(...)
{
allocateHandle(&h);
}

A(A &&src) : h(src.h)
{
src.h = INVALID;
}

A& operator= (A &&rhs)
{
if (this == &rhs) return *this;
if (h != INVALID) freeHandle(h);
h = rhs.h;
rhs.h = INVALID;
return *this;
}

~A()
{
if (h != INVALID)
freeHandle(h);
}

SomeHandle h;
}

如果没有“无效句柄”值,可以更改h的类型至 std::optional<SomeHandle>并使用 std::nullopt作为无效值。

关于c++ - 如何将 std::vector 用于带句柄的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56253581/

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