【问题标题】:C++ Destructor of Vector [closed]Vector 的 C++ 析构函数 [关闭]
【发布时间】:2022-11-20 21:29:48
【问题描述】:

我直接回答大家的问题:

class Abonne{
  private:
    int num;
    string nom;
    int abonnement;
    string titre;
  public:
    /** Methods **/
};

我在另一个类中创建了一个 Abonne 向量:

class Biblio{
  private:
    vector<Ouvrage*> O;
    vector<Abonne> A;
  public:
    ~Biblio();
    /** Methods **/
};

所以这是我这个类'Biblio'的析构函数的开发:

Biblio::~Biblio()
{
    vector<Ouvrage*>::const_iterator it1;
    for(it1=O.begin(); it1!=O.end(); it1++){
        delete(*it1);
    }
    vector<Abonne>::const_iterator it2;
    for(it2=A.begin(); it2!=A.end(); it2++){
        delete(it2);
    }
}

所以我的问题是,我收到一个错误消息:delete(it2); 为什么会这样?我不必为没有指针的向量创建析构函数吗?

我只是 c++ 中这种多态性的新手。所以我学会了如何创建一个充满指针的向量的析构函数。我在一个简单的向量上使用了同样的东西,但我有一个错误。我猜函数 delete();不适用于非指针?

【问题讨论】:

  • 您在显示代码的任何地方都没有使用new,那么为什么要使用delete?提供minimal reproducible example
  • 另外,开始使用smart pointers
  • 你需要deletenew什么,别无其他。
  • 是的,delete 仅适用于指向使用 new 分配的对象的指针。一般经验法则:如果可能,不要使用newdelete:如您所知,如果您使用new,然后一个不再在范围内的对象被释放(你不能忘记自己做)。您的用例似乎是您可以使用智能指针安全实现的一个很好的例子。
  • 如果这个vector&lt;Ouvrage*&gt; O;拥有它的内容;然后将其替换为:(a) vector&lt;Ouvrage&gt; O; 如果没有多态性或 (b) vector&lt; std::unique_ptr&lt;Ouvrage&gt; &gt; O; 如果有多态性。

标签: c++ vector


【解决方案1】:

vector 已经有自己的析构函数来处理它包含的对象。但是当成员是指针时,vector 将销毁指针本身,但不会销毁所指向的内容。

当且仅当这些对象是使用 new 创建的时,它们还需要匹配的 delete

【讨论】:

    猜你喜欢
    • 2020-06-20
    • 2017-03-03
    • 1970-01-01
    • 2016-11-04
    • 2012-09-17
    • 2011-02-14
    • 2018-08-29
    • 2020-11-01
    • 2020-04-06
    相关资源
    最近更新 更多