在 C++ 中删除动态字符**
Deleting dynamic char** in C++
披露:我正在尝试解决具有严格时间和内存限制的挑战。我通常会使用向量和字符串,但在这里我需要最快和最小的解决方案(向量实际上 运行 超出了时间限制),所以我转向了 char* 的动态数组。
我的代码的相关部分:
char** substrings(string s, int* n){
*n = 0;
...
////////////////////////////////
char** strings = new char*[*n];
////////////////////////////////
for (int i = 0; i < s.length(); i++){
for (int j = 1; j < s.length() - i + 1; j++){
...
strings[si] = tmp;
...
}
}
return strings;
}
int main(){
...
for (int ti = 0; ti < t; ti++){
cin >> s;
char** substr = substrings(s, &n);
...
for (int i = 0; i < n; i++){
delete substr[i];
}
}
return 0;
}
在不删除数组的情况下一切都运行良好,但这是不可接受的,那么我该如何处理呢?我尝试了很多看起来合乎逻辑的变体,但我遇到了运行时错误。
类似于分配,但顺序相反,使用delete[]
代替new[]
:
for(int i = 0; i < LENGTH; i++)
delete[] strings[i]; // delete each pointer in char** strings
delete[] strings; // finally delete the array of pointers
我这里假设LENGTH
是指向char*
的指针数组的长度。所以看起来你只执行了第一轮取消分配
for (int i = 0; i < n; i++){
delete substr[i]; // need delete[] substr[i] here
但是使用 delete
而不是 delete[]
,你需要 delete[] substr[i]
,因为我的猜测是 substr[i]
是指向第一个的 char*
指针new[]
分配的 char
数组的元素。你终于需要额外的
delete[] substr;
披露:我正在尝试解决具有严格时间和内存限制的挑战。我通常会使用向量和字符串,但在这里我需要最快和最小的解决方案(向量实际上 运行 超出了时间限制),所以我转向了 char* 的动态数组。 我的代码的相关部分:
char** substrings(string s, int* n){
*n = 0;
...
////////////////////////////////
char** strings = new char*[*n];
////////////////////////////////
for (int i = 0; i < s.length(); i++){
for (int j = 1; j < s.length() - i + 1; j++){
...
strings[si] = tmp;
...
}
}
return strings;
}
int main(){
...
for (int ti = 0; ti < t; ti++){
cin >> s;
char** substr = substrings(s, &n);
...
for (int i = 0; i < n; i++){
delete substr[i];
}
}
return 0;
}
在不删除数组的情况下一切都运行良好,但这是不可接受的,那么我该如何处理呢?我尝试了很多看起来合乎逻辑的变体,但我遇到了运行时错误。
类似于分配,但顺序相反,使用delete[]
代替new[]
:
for(int i = 0; i < LENGTH; i++)
delete[] strings[i]; // delete each pointer in char** strings
delete[] strings; // finally delete the array of pointers
我这里假设LENGTH
是指向char*
的指针数组的长度。所以看起来你只执行了第一轮取消分配
for (int i = 0; i < n; i++){
delete substr[i]; // need delete[] substr[i] here
但是使用 delete
而不是 delete[]
,你需要 delete[] substr[i]
,因为我的猜测是 substr[i]
是指向第一个的 char*
指针new[]
分配的 char
数组的元素。你终于需要额外的
delete[] substr;