gpt4 book ai didi

c++ - 为什么动态分配的对象无法释放?

转载 作者:太空狗 更新时间:2023-10-29 23:33:18 25 4
gpt4 key购买 nike

我知道这应该是一个微不足道的问题,但需要找出原因。

以下代码编译失败

a.out(93143) malloc: *** error for object 0x7fff5af8293f: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

代码:

#include <iostream>

using namespace std;

class A
{
};

class B
{
private:
A a;
public:
B(){a=*new A();}
~B(){delete &a;}
};

int main()
{
B b;
}

根据即时的评论,我意识到“new”中动态分配的对象在分配给“a”后立即失去了所有者。现在,如果我确实想要一个对象而不是指向“A”的指针,最好的解决方案是什么?

最佳答案

因为你的成员变量不是指针。您没有存储动态分配的对象,而是将其拷贝分配给 A a; 并泄漏了动态分配的对象。

将 B 类更改为:

class B
{
private:
A* a;
public:
B(){a= new A();}
~B(){delete a;}
};

或者更好

class B
{
private:
A a;
public:
B() {}
~B(){}
};

如果您真的需要一个动态分配的对象,我想提出这个使用智能指针的最终解决方案(为此您需要 C++11 或 boost):

#include <memory>
#include <iostream>

class A
{
public:
A() { std::cout << "Hi" << std::endl; }
~A() { std::cout << "Bye" << std::endl; }
};

class B
{
public:
B(): a(new A()) {};
//~B() {} <-- destructor is no longer needed, the unique_ptr will delete the object for us
private:
std::unique_ptr<A> a;
};

int main(int argc, char* argv[])
{
B b;
}

你可以看到 A 的构造函数和析构函数称为 here .

关于c++ - 为什么动态分配的对象无法释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17730699/

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