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)
是的,它确实.如果更改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)