在C++中,如何编写析构函数来释放指向结构的指针的内存?

use*_*107 9 c++ struct

这是我的结构A.

struct A {
    int a1;
    int a2;
    ~A() { }
};
Run Code Online (Sandbox Code Playgroud)

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 <----
    }
};
Run Code Online (Sandbox Code Playgroud)

后来我使用下面的代码

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

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

Car*_*arl 17

如果您使用的是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!
};
Run Code Online (Sandbox Code Playgroud)

分配内容时使用共享指针:

#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
Run Code Online (Sandbox Code Playgroud)

这里有关于智能指针主题的更多信息.

我还要提一下,如果你没有C++ 11编译器,你可以从BOOST库中获取共享指针.


0x4*_*2D2 6

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

所以没有必要担心删除As数据,因为它将沿着类的实例从内存中被破坏.


Cam*_*ron 5

您只有一个指向的指针A。因此,您只需要删除它:

~B() {
     delete ptr2A;
}
Run Code Online (Sandbox Code Playgroud)

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