【问题标题】:Destructor of a pointer to an array指向数组的指针的析构函数
【发布时间】:2019-06-20 00:19:34
【问题描述】:

我有一个指向字符串的指针

string* relatori;

在类构造函数中

Conference() : numMaxRel(10)
{
    relatori = new string[numMaxRel];
}

这是一个标准数组,第一个元素上有一个指针?所以在 destrcutor 内部我必须执行以下操作?

Conference::~Conference()
{
    delete rel;
}

【问题讨论】:

  • delete,你new,你delete[],你new[]。混合这些(就像你在这里所做的那样)是未定义的行为(需要delete[] relatori;)。
  • 使用std::vector,不用再担心这种事情了。
  • 是的,如果您在构造函数中使用运算符“new”分配内存,则需要通过在析构函数中调用“delete”来释放内存。但也许为你使用 std::vector 更好?
  • 现在试试这个 -- {Conference c1; Conference c2 = c1;} -- 即使你使用了正确的delete[] 形式,这只会导致你进入上面显示的错误(双重删除)。你会从煎锅里跳进火里。只需使用std::vector

标签: c++ string pointers constructor destructor


【解决方案1】:

删除自使用 [] 分配以来指向的整个数组

  delete []rel;

【讨论】:

  • 没错,我认为不需要 [],因为它不是指针数组。
【解决方案2】:

delete rel 无法释放数组的内存。为此,您必须使用delete[] rel。但是,您应该知道,您可以使用标准库中的容器来为您进行内存管理,例如 std::vector<string>。这几乎总是首选方式。这就是你的类的样子(注意:你不需要析构函数):

class Conference
{
public:
    Conference() : numMaxRel(10)
    {
        rel.reserve(numMaxRel);
    }

private:
    size_t numMaxRel;
    std::vector<std::string> rel;
};

另外请注意,您现在有一个自定义的复制构造函数和移动构造函数、复制和移动分配,它们开箱即用,可以按照您的期望执行。

【讨论】:

    猜你喜欢
    • 2013-10-19
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2017-06-03
    相关资源
    最近更新 更多