【问题标题】:Overriding default destructor for strings in class implementation在类实现中覆盖字符串的默认析构函数
【发布时间】:2017-02-22 04:33:13
【问题描述】:

我正在尝试使用顺序列表来实现队列。但是,对于带有字符串元素的队列,程序会崩溃。

下面是 Queue 构造函数的相关部分:

{
  string *ptr = new string[num];
}

看了一会儿,我怀疑问题出在析构函数上。在调用析构函数时,我正在删除顺序列表的数组指针并将其设置为 NULL:

{
  delete ptr;
  ptr = NULL;
}

但是,由于字符串库提供了一个默认析构函数,它会删除字符串,然后我试图删除一个不存在的指针。我认为这将访问不可访问的内存,这会导致分段错误。队列实现非常适合 int 和 double ,就像它目前的状态一样。

我正在为 int、double 和 string 元素类型使用模板。如果析构函数为空,则不会为 int 和 double 元素队列动态释放内存。

除了有一个空的类析构函数并使用默认的字符串析构函数之外,还有什么简单的方法可以解决这个问题?

【问题讨论】:

  • 你为什么不使用std::string?没有必要重写析构函数。如果您的模板适用于intdouble,那么它应该适用于std::string,而无需特别需要delete
  • 发布一个最小但完整的示例,读者可以通过复制和粘贴代码并编译它来尝试。
  • Alf - 这个问题与课堂作业的奖金有关,所以我试图更笼统。不过,谢谢你的建议。
  • 你有new[],但没有delete[]。这是一个错误。
  • 我正在使用 std::string 并且它确实有效,但我需要修改析构函数。如果我不删除 int 和 double 队列,那会不会导致动态内存的不正确释放?

标签: c++ memory queue


【解决方案1】:

delete 仅删除非简单类型的第一个实例。 delete[] 为所有实例调用 dtors

我不知道这里的全部范围,但只是为了说明,删除一个 nullptr 是明确定义的,不会做任何事情。

【讨论】:

    猜你喜欢
    • 2013-10-27
    • 2017-04-21
    • 2013-03-13
    • 2014-01-09
    • 2017-11-10
    • 1970-01-01
    • 2022-06-23
    • 2011-11-14
    • 2023-03-19
    相关资源
    最近更新 更多