在 C++ 中使用 delete 避免内存泄漏

Avoid memory leak with delete in C++

我有以下代码:

class A{
    A(){}; 
};

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

int main()
{
    
    B* b1 = new B();
    
    //delete B;
    return 0;
}

我想知道 main 中动态对象 b1 的正确删除是什么?据我了解,我们不需要在 main 中添加删除,因为对象 B 作为指针的动态数组并在 return 上调用析构函数。是吗?

如果您使用 new 创建对象,则需要 delete

B* b1 = new B();
...    
delete b1;

或者,您可以使用智能指针,它们会为您调用 delete

std::unique_ptr<B> b1( new B );

注意:要使用 unique_ptr,您需要包含 <memory>

we don't need to add a delete in main since the object B as a dynamic array of pointers and calls the destructor on return. Is that right?

不,那是错误的。

如果你用 new 分配了一些东西而不用 delete 释放那个指针,那么分配就会泄漏。

P.S。 B 非常不安全,因为它是可复制的,但复制它会导致未定义的行为。

what is the proper delete for dynamic object b1 in main?

b1 不是动态对象。它是一个指针,指向一个动态对象。

管理动态分配的正确方法是不要使用裸拥有指针。此外,应避免不必要的动态分配。示例:

class B{
    std::vector<A*> a;
public:
    B() : a(10){}
};

int main()
{
    B b;
}