这里是我的结构的
struct A {
int a1;
int a2;
~A() { }
};
B
是包含一个指向另一结构
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.内正确的析构函数中指出,并删除它们?
如果您使用的是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库 。
你只需要delete
的分配对象new
。 在这种情况下,没有必要删除b1
,因为它没有被动态分配。 此外,如果你没有初始化ptr2a
动态内存,删除它是不确定的行为。
所以没有必要担心删除A
s的数据,因为它会从内存沿王氏的类的实例被破坏。
你只得到了一个指向A
。 所以,你只需要删除:
~B() {
delete ptr2A;
}
请注意,您不能delete
B1,因为它是一个普通的int
! (由结构的变量,如被占用的存储b1
和指针ptr2A
本身(不是它指向)与该结构的任何实例沿着自动销毁。)
文章来源: In C++, how to write a destructor for freeing memory of pointer to a structure?