【问题标题】:In C++, how to write a destructor for freeing memory of pointer to a structure?在 C++ 中,如何编写析构函数来释放指向结构的指针的内存?
【发布时间】:2015-07-03 06:55:42
【问题描述】:

这是我的结构 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 指向的每个元素并删除它们?

【问题讨论】:

标签: c++ struct


【解决方案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

Here's more info 关于智能指针的主题。

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

【讨论】:

  • 对不起。我花了很长时间打字。我已在问题中添加了详细信息。我稍后会使用 new 运算符
  • 谢谢!所以你的意思是我只需要做一个delete ptrB 就可以了?
  • 只要使用智能指针,就不需要进行删除。有各种类型的智能指针,但现在从 shared_ptr 开始。
【解决方案2】:

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

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

【讨论】:

  • 对不起。我花了很长时间打字。我已在问题中添加了详细信息。稍后我会使用 new 运算符。
  • 所有你需要做的就是使用delete ptrB 当你完成使用它指向的内存。不要在类中这样做,在你定义它的 main 中这样做。
  • 啊。我的印象是代码delete ptrB 将调用B 的析构函数。所以我们必须在B 的析构函数中执行它(释放aa1 指向的内存)。
【解决方案3】:

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

~B() {
     delete ptr2A;
}

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

【讨论】:

  • 对不起。我花了很长时间打字。我已在问题中添加了详细信息。我稍后会使用 new 运算符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 2020-04-15
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-29
相关资源
最近更新 更多