gpt4 book ai didi

类对象的 std::vector 的 C++ 析构函数问题

转载 作者:IT王子 更新时间:2023-10-28 23:36:37 28 4
gpt4 key购买 nike

当我有一个类的 std::vector 时,我对如何使用析构函数感到困惑。

所以如果我创建一个简单的类如下:

class Test
{
private:
int *big;

public:
Test ()
{
big = new int[10000];
}

~Test ()
{
delete [] big;
}
};

然后在我的主要功能中执行以下操作:

Test tObj = Test();
vector<Test> tVec;
tVec.push_back(tObj);

当我超出范围时,我在 Test 的析构函数中遇到运行时崩溃。为什么会这样?如何安全地释放我的内存?

最佳答案

问题是您没有为 Test 定义复制构造函数.所以编译器会为你生成一个默认的复制构造函数,它只是复制对象的内容——在本例中是 int 指针。

现在,当您将对象推回 vector 中时,它会被复制构造函数隐式复制。这导致两个对象指向同一个整数数组!所以最后,两个析构函数尝试删除同一个数组 - BANG。

每当你定义一个通过指针*拥有成员的类时,除了析构函数之外,你必须还为它定义一个复制构造函数。 更新: 和赋值运算符,出于同样的原因(感谢@James :-)

更新2:解决所有这些限制的简单方法是定义一个静态数组而不是动态分配的数组:

class Test
{
private:
int big[10000];
// no need for constructors, destructor or assignment operator
};

但是,最佳做法是使用 std::vector<int>而不是数组。

* 即包含指向具有所有权语义的成员的指针(感谢@Steve Jessop 的澄清)

关于类对象的 std::vector 的 C++ 析构函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2745350/

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