【问题标题】:Deleting an Object in c++ implies deletion of its members?在 C++ 中删除一个对象意味着删除它的成员?
【发布时间】:2018-11-26 18:56:20
【问题描述】:

我对 c++ 很陌生,我有一个问题。

如果我有一个包含(指向一个)向量的类:

class myClass {
public:
    int* direction;
    myClass(int d){direction=new int[d];}
}

当我创建一个对象并在 main 中删除它时:

int main(){
    int d;
    myClass* myvec;
    myvec = new myClass(d);
    delete myvec;
}

myvec->direction 的析构函数也被连贯地调用并释放了内存?还是我必须为此编写一个合适的方法?

我希望问题很清楚......

【问题讨论】:

  • 您没有包含向量的类。您有一个包含指针的类。使用std::vector,就可以了。或者,std::unique_ptr 如果您关心向量内存开销。
  • 删除一个对象意味着破坏它的成员。对于一个包含delete指向的原始指针(vectorpointer 已销毁,但这不同于调用delete vector; )。尽可能避免使用原始欠指针(您需要记住 delete 的指针),而根据情况使用智能指针(如 std::unique_ptr)或标准容器(如 std::vector)。
  • 我没有投反对票。请记住,问题的目的是帮助未来的读者解决同样的问题。 StackOverflow 不是论坛。 3 人投票说这个问题不是一个好的教具。
  • @Thomas 1) 经验法则是:delete 你是什么new(除了delete[] 你是什么new[]),避免使用new必要的。 2)如果你是初学者,你应该向good C++ book学习,而不是随机编码。
  • 那就是std::vector<int> vector;。注意:我建议不要使用vector 作为您的成员的名称,因为它也是标准类型的名称。它可能会使代码在阅读、推理和讨论时产生不必要的混乱。

标签: c++ memory-management


【解决方案1】:

如果你已经用new 分配了内存,你也需要delete 它,像这样:

class myClass {
      int* direction;
public:
      myClass(int d) : direction(new int[d]) {}
      ~myClass() {
          delete[] direction;
      }
}

但是您还需要编写一个复制构造函数和复制赋值运算符,并且在 C++11 和更高版本中还需要一个移动构造函数和移动赋值运算符,这样才能正常工作。否则,当您使用此类的实例时,您将面临复制原始指针的默认版本的风险。

看看the rule of three/five/zero

最好使用std::vector<int> 而不是原始指针。

【讨论】:

    猜你喜欢
    • 2013-02-26
    • 2018-06-11
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2012-01-08
    • 1970-01-01
    • 2013-07-28
    相关资源
    最近更新 更多