10

这是我的结构A

struct A {
    int a1;
    int a2;
    ~A() { }
};

B是另一个包含指向 A 的指针的结构

 struct B {
    B(int b, A* a)
      : b1(b), ptr2A(a)
    {}
    int b1;
    A* ptr2A;

    ~B() {
         delete b1;
         // traverse each element pointed to by A, delete them <----
    }
};

稍后我使用下面的代码

int bb1;
vector <A*> aa1;
// do some stuff
B *ptrB = new B(bb1, aa1);

我需要删除/释放 ptrB 指向的所有内存。因此,我需要在结构 B 中编写正确的析构函数。如何遍历 A 指向的每个元素并删除它们?

4

3 回答 3

19

如果您使用的是 C++11 编译器,只需使用 std::shared_ptr 就不必担心删除。这是因为 shared_ptr 是一个“智能”指针,它会自动删除它所指向的内容。

#include <memory>
struct B 
{
    int b1;
    std::shared_ptr<A> ptr2A;
    B(int b, std::shared_ptr<A> a):b1(b),ptr2A(a)({}
    ~B(){} //look ma! no deletes!
};

每当您分配某些东西时,请使用共享指针:

#include<memory>
...
{
    ....
    std::shared_ptr<B> ptrB( new B(bb1, aa1) );
    //Here is another, more readable way of doing the same thing:
    //auto ptrB = std::make_shared<B>(bb1,aa1);
    ...
}
//no memory leaks here, because B is automatically destroyed

这是有关智能指针主题的更多信息

我还应该提到,如果您没有 C++11 编译器,您可以从BOOST 库中获取共享指针。

于 2013-02-21T03:06:11.913 回答
6

您只需要将delete对象分配给new. 在这种情况下,不需要删除b1,因为它没有被动态分配。此外,如果您没有ptr2a使用动态内存进行初始化,则删除它是未定义的行为。

因此无需担心删除As 数据,因为它会与类的实例一起从内存中销毁。

于 2013-02-21T03:00:59.057 回答
5

您只有一个指向A. 所以你只需要删除它:

~B() {
     delete ptr2A;
}

请注意,您不能deleteb1,因为它是普通的int!(结构的变量占用的内存,例如b1指针ptr2A本身(不是它指向的内容)与该结构的任何实例一起被自动销毁。)

于 2013-02-21T02:56:43.477 回答