【问题标题】:Delete an array of queue objects删除队列对象数组
【发布时间】:2011-07-20 06:58:30
【问题描述】:

我正在处理一个包含queues 数组的对象,该数组的长度在调用构造函数之前不会确定。基本上它看起来像下面这样

#include <queue>

class myClass{
public:
  //public functions
private:
  //private functions and variables

  queue<int>* myQueue;
};

它是这样初始化的:

myClass::myClass(int numOfQueues){
  myQueue = new queue<int>[numOfQueues];
}

看起来,这一切都很好。它的功能与我希望的完全一样,但是现在每次退出程序时都会出现分段错误。该类中还有一些其他数组,它们以相同的方式初始化,但它们的类型是boolint,而不是队列。我的析构函数看起来像:

myClass::~myClass(){
  delete boolArray;
  delete intArray;
  delete myQueue;
}

现在我假设这个析构函数适用于boolArrayintArray 指针,因为直到我添加myQueue 才开始出现段错误。有谁知道编写析构函数的正确方法是什么?是否有可能这就是我所要做的,而析构函数没有在适当的时间被调用?

【问题讨论】:

  • 如果您没有在myClass 析构函数之前的任何位置删除myQueue,则删除它不会导致分段错误。

标签: c++ arrays pointers queue delete-operator


【解决方案1】:

Naveen 已经解决了这个问题。我想添加一个良好的编程习惯。

下面的用例也会产生删除问题。

void foo()
{
    myClass a;
    myClass b(a);
}

当我们声明 a 时,将创建一个新的 myQueue 实例。然而,当声明 b 时,将调用复制构造函数而不是 myClass::myClass(int numQueues) 构造函数。因此 a.myQueue == b.myQueue。

退出函数foo时,a的析构函数会删除myQueue,然后b的析构函数会尝试删除未引用的指针,这将导致致命错误。

一个好的编程习惯是相应地实现 copy constructor= operator 或者声明 copy constructor= operator private 以避免此类问题。

private:
    myClass(const myClass&);
    const myClass& operator=(const myClass&);

另请参阅boost::NonCopyable

【讨论】:

    【解决方案2】:

    deletenew[] 一起使用不仅会导致内存泄漏,还会调用未定义的行为。

    new[] 一起使用的delete 的正确形式是delete[]

    但是,在惯用的 C++ 中,始终建议使用 std::vector 而不是使用 C 样式的数组。使用 STL 容器时,您无需自己显式管理内存。

    【讨论】:

    • 很高兴知道这一点。我已经让代码按原样工作了,所以我想我暂时不用管它,但下次我需要做类似的事情时,我一定会记住这一点。
    • 真正的男人不会使用向量!新的和删除的就像男士工具,你买一个新的工具,然后删除一个用过的。另一方面,矢量很好,但它们更像女士手提包,你用各种垃圾填满它们,很快就把包扔掉去买一个新的。
    【解决方案3】:

    因为您使用new[] 分配,所以您应该在析构函数中使用delete[] myQueue;。否则它将调用未定义的行为。顺便说一句,如果您不想遇到此类内存管理问题,可以使用std::vector&lt;std::queue&lt;int&gt; &gt;

    【讨论】:

    • 哦,哇,这对我来说是一个难以置信的明显错误。这解决了问题。非常感谢。
    【解决方案4】:

    你为什么不使用 std::vector 而不是数组?

    你需要delete[] 数组,而不是delete - 你分配了new[]

    【讨论】:

    • 我没有使用矢量,因为我以前从未使用过它们,也不知道它们会更好地解决我的问题。不过,我肯定会研究未来的向量。谢谢。编辑:实际上我只是阅读了向量使用的摘要,我认为这里不需要向量。初始化数组后,它永远不会改变大小。大小不是硬编码的,它是根据用户输入决定的。
    • @Alex:看看vector::reserve 方法,它可能对您的要求有用。 cplusplus.com/reference/stl/vector/reserve
    • @Alex:在考虑使用向量时(就像这里的大多数建议一样),还要考虑到使用向量成员,您不需要析构函数或复制构造函数或 operator=()这是动态数组作为成员所必需的(请参阅en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming))。
    猜你喜欢
    • 2012-07-27
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-06
    • 2012-05-12
    • 2014-03-07
    相关资源
    最近更新 更多