gpt4 book ai didi

c++ 析构函数 - 何时使用它们以及要删除的内容

转载 作者:太空宇宙 更新时间:2023-11-04 12:09:19 29 4
gpt4 key购买 nike

我在当前项目上遇到了困难。在以前的版本中,我使用了 std::vectors 并且一切正常,没有内存泄漏,没有错误,很好。

然后我转而使用一些指针,因为它更优雅,而且我的性能也有所提高。

所以我有这样的类(class)

class A
{
private:
std::string str;
public:
A() {str = "";}
};

class B
{
private:
std::string str;
A* a;
public:
B() {str = ""; a = NULL; }
};

class C
{
private:
std::vector<B*> bs;
public:
C() { bs = std::vector<B*>(); }

};

我知道每次我使用new,之后我都必须delete。所以我为 class Bclass C 创建了析构函数。

我认为它应该是这样的:

B::~B()
{
if ( this->a != NULL )
delete this->a;
}

C::~C()
{
while ( (this->bs).size() > 0 )
{
if ( (this->bs).back() != NULL )
delete (this->bs).back();
(this->bs).pop_back();
}
(this->bs).clear(); // not necessary since bs has size 0?
}

但是,我遇到了各种错误,例如 valgrind 中的“Invalid read of size 4”。

我对析构函数应该是什么样子的想法是否正确?我的代码还有什么问题?将私有(private) std::string 成员更改为 std::string 指针会好吗?在析构函数中执行 str = ""; 是必要的还是好事?

旁注:请理解,我已经对“适当的析构函数”和类似的关键字进行了大量搜索,但没有任何帮助。如果您认为这个问题被问得太频繁:我不这么认为,因为我不明白。

最佳答案

Rob 所说的以及您的析构函数可以简化为:

B::~B()
{
delete a;
}

C::~C()
{
for (size_t i = 0; i < bs.size(); ++i)
delete bs[i];
}

关于c++ 析构函数 - 何时使用它们以及要删除的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10553182/

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