【问题标题】:Proper way of deleting a char** array删除 char** 数组的正确方法
【发布时间】:2014-08-18 10:49:49
【问题描述】:

我有一个动态分配的 char** 数组作为我的一个类中的私有成员。

根据字数进行第一次分配

client_interests = new char* [n];

后面数组的每个索引都是按照字长+1分配的

char[i] = new char [strlen(word)+1];

这是否是释放此成员内存的正确方法(dtor 类正在调用此函数)?

void Client::deallocate()
{
    int i;
    for (i = 0; i < n; i ++) //loops through each word
    {
        delete [] client_interests[i]; //each word is an array of characters, hence delete [] is used
    }
    delete [] client_interests; //deallocating the pointer
    client_interests = NULL;
}

谢谢!

【问题讨论】:

  • 老实说,使用std::vector&lt;std::string&gt; 将是彻底处理此问题的最“正确”方式。
  • 是的,我知道 - 但这是给我们的任务,我们必须使用 c 类型的字符串。
  • 您的代码似乎没有任何错误,尽管std::vector&lt;std::string&gt;更好的解决方案。
  • 要在循环前检查client_interests是否为空;否则,第二次调用该函数会用空指针做坏事。 (或者,直接在析构函数中完成这项工作,所以没有调用它两次的危险)。另外,请确保您关注Rule of Three(标准容器会自动为您提供)。

标签: c++ arrays memory-management


【解决方案1】:

您的代码是正确的。由于您使用new [] 分配,因此需要像您一样使用delete [] 取消分配。此外,显然还需要以相反的顺序取消分配 - 首先是内部数组,然后是外部数组。

【讨论】:

  • 如果您真的想要逆序,for (i = n-1; i &gt;= 0; --i) 怎么样? ;)
  • @FredOverflow 如果您愿意,但这不是必需的,也可能不那么可读。相反的顺序只需要适用于外部/内部,而不是单独的内部分配本身,因为它们是独立的。也就是说,如果有额外的语义和异常安全问题,按照你说的做可能是合适的。
【解决方案2】:

是的,如果你绝对不能使用std::vector&lt;std::string&gt;,那么你的释放方式是正确的。

【讨论】:

    【解决方案3】:

    是的,这是释放二维数组的正确方法。

    delete []
    

    用于释放一个数组,当你第一次释放内部数组而不是外部数组时,你做得正确。

    【讨论】:

      猜你喜欢
      • 2012-04-08
      • 2012-07-19
      • 2015-07-18
      • 2017-07-24
      • 2013-01-26
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多