这是我的结构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指向的所有内存。因此,我需要在struct B中编写正确的析构函数。如何遍历A指向的每个元素并删除它们?
答案 0 :(得分:15)
如果您使用的是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
Here's more info关于智能指针的主题。
我还应该提一下,如果你没有C ++ 11编译器,你可以从BOOST library获得共享指针。
答案 1 :(得分:6)
您只需要delete
分配的new
个对象。在这种情况下,不需要删除b1
,因为它尚未动态分配。此外,如果您没有使用动态内存初始化ptr2a
,则删除它是未定义的行为。
因此无需担心删除A
数据,因为它将从类的实例中被内存破坏。
答案 2 :(得分:4)
你只有一个指向A
的指针。所以你只需删除它:
~B() {
delete ptr2A;
}
请注意,您不能delete
b1,因为它是普通的int
! (由结构变量占用的内存,例如b1
和指针ptr2A
本身(不是它指向的内容)会随着该结构的任何实例自动销毁。)