删除c++中的动态char**



披露:我正在尝试解决一个具有严格时间和内存限制的挑战。我通常会使用向量和字符串,但这里我需要最快和最小的解决方案(对于向量,它实际上超过了时间限制),所以我转向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]是指向new[]分配的char s数组的第一个元素的char*指针。最后需要额外的

delete[] substr;

最新更新