是否需要在原始指针位置调用delete []

Kil*_*ian 2 c++ memory memory-management

根据这个问题的答案:" delete [] " 如何知道"操作数数组的大小? "

你的分配器将跟踪你分配的内存量

多么自由地知道释放多少内存"

是的,内存块大小由malloc存储在"某处"(通常在块本身中),这就是免费知道的.但是,new []/delete []是一个不同的故事.后者基本上在malloc/free之上工作.new []还存储它在内存块中创建的元素数量(独立于malloc),以便后来delete []可以检索并使用该数字来调用适当数量的析构函数

这是否意味着delete []与指针指向的位置无关?以下代码是否有效或是否会导致内存泄漏?

void createArray(){
    char* someArray = new char[20];
    readData(someArray);
    //Is this delete still valid after moving the pointer one position?
    delete[] someArray;
}

char readData(char* &arr){
    char value = *arr;
    //Let it point to the next element
    arr += 1;
    return value;
}
Run Code Online (Sandbox Code Playgroud)

Ron*_*Ron 8

是的,它确实.如果更改new[]-ed指针值然后delete[]在其上调用operator,则调用未定义的行为:

char* someArray = new char[20];
someArray++;
delete[] someArray; // undefined behavior
Run Code Online (Sandbox Code Playgroud)

而是将原始值存储在不同的指针中并调用delete[]它:

char* someArray = new char[20];
char* originalPointer = someArray;
someArray++; // changes the value but the originalPointer value remains the same
delete[] originalPointer; // OK
Run Code Online (Sandbox Code Playgroud)