删除 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<std::string>
将是彻底处理此问题的最“正确”方式。
2-Dimensional array deallocation 的可能重复项
是的,我知道 - 但这是给我们的任务,我们必须使用 c 类型的字符串。
您的代码似乎没有任何错误,尽管std::vector<std::string>
是远更好的解决方案。
要在循环前检查client_interests
是否为空;否则,第二次调用该函数会用空指针做坏事。 (或者,直接在析构函数中完成这项工作,所以没有调用它两次的危险)。另外,请确保您关注Rule of Three(标准容器会自动为您提供)。
【参考方案1】:
您的代码是正确的。由于您使用new []
分配,因此需要像您一样使用delete []
取消分配。此外,显然还需要以相反的顺序取消分配 - 首先是内部数组,然后是外部数组。
【讨论】:
如果您真的想要逆序,for (i = n-1; i >= 0; --i)
怎么样? ;)
@FredOverflow 如果您愿意,但这不是必需的,也可能不那么可读。相反的顺序只需要适用于外部/内部,而不是单独的内部分配本身,因为它们是独立的。也就是说,如果有额外的语义和异常安全问题,按照你说的做可能是合适的。【参考方案2】:
是的,如果你绝对不能使用std::vector<std::string>
,那么你的释放方式是正确的。
【讨论】:
【参考方案3】:是的,这是释放二维数组的正确方法。
delete []
用于释放一个数组,当你第一次释放内部数组而不是外部数组时,你做得正确。
【讨论】:
以上是关于删除 char** 数组的正确方法的主要内容,如果未能解决你的问题,请参考以下文章