删除 char** 数组的正确方法

Posted

技术标签:

【中文标题】删除 char** 数组的正确方法【英文标题】:Proper way of deleting a char** array 【发布时间】: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; 将是彻底处理此问题的最“正确”方式。 2-Dimensional array deallocation 的可能重复项 是的,我知道 - 但这是给我们的任务,我们必须使用 c 类型的字符串。 您的代码似乎没有任何错误,尽管std::vector&lt;std::string&gt;更好的解决方案。 要在循环前检查client_interests是否为空;否则,第二次调用该函数会用空指针做坏事。 (或者,直接在析构函数中完成这项工作,所以没有调用它两次的危险)。另外,请确保您关注Rule of Three(标准容器会自动为您提供)。 【参考方案1】:

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

【讨论】:

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

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

【讨论】:

【参考方案3】:

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

delete []

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

【讨论】:

以上是关于删除 char** 数组的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

循环删除数组中元素的正确方法

为啥我的 char 数组长度不正确?

C:从 char 数组打印会产生错误字符

char数组的动态内存分配

将NSString转换为char数组[重复]

删除动态数组时崩溃