在C ++中,如何编写用于释放指针的存储器的结构的析构函数?(In C++, how to writ

2019-08-17 02:06发布

这里是我的结构的

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.内正确的析构函数中指出,并删除它们?

Answer 1:

如果您使用的是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库 。



Answer 2:

你只需要delete的分配对象new 。 在这种情况下,没有必要删除b1 ,因为它没有被动态分配。 此外,如果你没有初始化ptr2a动态内存,删除它是不确定的行为。

所以没有必要担心删除A s的数据,因为它会从内存沿王氏的类的实例被破坏。



Answer 3:

你只得到了一个指向A 。 所以,你只需要删除:

~B() {
     delete ptr2A;
}

请注意,您不能delete B1,因为它是一个普通的int ! (由结构的变量,如被占用的存储b1和指针ptr2A本身(不是它指向)与该结构的任何实例沿着自动销毁。)



文章来源: In C++, how to write a destructor for freeing memory of pointer to a structure?
标签: c++ struct