gpt4 book ai didi

c++ - delete 和 delete[] 的确切行为是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:25:47 29 4
gpt4 key购买 nike

为什么这段代码是错误的?我是否遗漏了有关 deletedelete[] 行为的内容?

void remove_stopwords(char** strings, int* length) 
{
char** strings_new = new char*[*length];
int length_new = 0;

for(int i=0; i<*length; i++) {
if(is_common_keyword(strings[i]) == 0) {
strings_new[length_new] = strings[i];
length_new++;
}
else {
delete strings[i];
strings[i] = nullptr;
}
}
delete[] strings;

strings = new char*[length_new];
for(int i=0; i<length_new; i++) {
strings[i] = strings_new[i];
}
delete[] strings_new;
*length = length_new;
}

说明:此代码应采用 C 风格字符串数组并删除其中的一些特定字符串; C 风格字符串数组是使用 new[] 创建的,每个 C 风格字符串都是使用 new 创建的。代码的结果是没有单词被取消,只是对数组进行了切片。

最佳答案

我在使用 new[] 时没有发现任何问题或 delete[]在显示的代码中。

不,等等。

我看到了很多¹问题,但您的意图很明确,而且代码似乎在按照您的意愿行事。

我注意到的唯一逻辑问题是您正在传递 strings按值(它是一个 char** 并且在函数中重新分配它不会影响包含指针的调用者变量)。将签名更改为

void remove_stopwords(char**& strings, int* length)

因此传递一个引用应该修复它。

(1) 使用std::vector<const char *>看起来更合乎逻辑,甚至更好 std::vector<std::string>如果可能的话,这将负责所有分配和解除分配。

关于c++ - delete 和 delete[] 的确切行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30405530/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com