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

标签 c++

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

以下代码编译失败

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/

相关文章:

java - 什么是 LD_LIBRARY_PATH 以及如何使用它?

c++ - 对于用 C 编写的 AVR micro,Const Char 数组被修改为全 0

读取超过 127 个 ASCII 值时 C++ cin 失败

c++ - c++中的队列指针和动态分配

c++ - 为什么 a = (a+b) - (b=a) 是交换两个整数的错误选择?

c++ - 编译标志不适用静态链接库

c++ - Windows 上的 qt MYSQL 连接不起作用

c++ - 关于 C++ 指针

c++ - 如何在 makefile 中包含和编译库

c++ - 为什么当我在 cpp 的初始化中指定多维数组时必须有边界