【问题标题】:How delete a pointer of classes which has pointer members?如何删除具有指针成员的类的指针?
【发布时间】:2012-03-18 21:29:26
【问题描述】:

我的意思是,如果我有类似的课程:

class A{
    int* pi;
};
*A pa;

当我拨打delete pa时,pi会被删除吗?

【问题讨论】:

  • 如果你把它编码成那样的话。如果您将其编码为不是,则不会。决定你想要的并编码。
  • 使用标准库容器或智能指针作为成员来避免这种情况。
  • 没有。但请注意,它将调用析构函数,您可以在其中清理 A 实例。如果你想在那里删除 pi,那么你可以这样做。 但是您必须首先确保您正确拥有指针。循环rule of three

标签: c++ class pointers delete-operator


【解决方案1】:

您需要为delete pi; 定义一个析构函数。此外,您还需要定义一个复制构造函数和赋值运算符,否则当A 的一个实例被复制时,两个对象将指向同一个int,当A 的一个实例被破坏时,它将被删除将A 的另一个实例留下一个悬空指针。

例如:

class A
{
public:
    // Constructor.
    A(int a_value) : pi(new int(a_value)) {}

    // Destructor.
    ~A() { delete pi; }

    // Copy constructor.
    A(const A& a_in): pi(new int(*a_in.pi)) {}

    // Assignment operator.
    A& operator=(const A& a_in)
    {
        if (this != &a_in)
        {
            *pi = *a_in.pi;
        }
        return *this;
    }
private:
    int* pi;
};

【讨论】:

    【解决方案2】:

    您需要编写一个析构函数来删除所有指针类型的成员。比如:

    class A
    {
        int *pi;
      public:
        ~A(){delete pi;}
    };
    

    您需要确保您的构造函数为 pi 分配了一个值(至少为 NULL)。就像@hmjd 的答案一样,您将需要实现或隐藏复制构造函数和赋值运算符。在这里寻找三法则: http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29

    【讨论】:

      【解决方案3】:

      您应该实现一个析构函数~A(),它负责清理A 的内容。之后,在 A 类型的指针上调用 delete 将清除所有内容。

      【讨论】:

      • 但是永远记住,如果你需要一个析构函数,你几乎肯定也需要一个复制构造函数和复制赋值运算符,根据Rule of Three
      猜你喜欢
      • 1970-01-01
      • 2018-03-24
      • 2021-12-22
      • 1970-01-01
      • 2013-12-30
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      相关资源
      最近更新 更多