可以在 C++ 中更改返回指针后删除工作
Can delete work after change of the returned pointer in C++
在C++中,我们使用new运算符动态分配内存。我的问题是,我们修改返回指针后,delete操作符能否知道从哪里开始删除呢?例如:
int (*a)[5] = new int[1][5];
a=a+1;
delete[] a;
没有。动态分配的内存只能使用分配返回的指针来释放。
之所以如此,是因为在实践中,分配器在指针returns之前存储分配元数据(因此它知道如何适当地释放它)。如果你在分配的后面传递给它一个指针,它会尝试读取前面的字节作为分配元数据,但当然它不是分配器元数据,它是你放在那里的任何随机数据。
还有其他分配策略 可能 避免将分配元数据放在那里(位字段等),但这些情况不太常见,而且通常仍然无法处理任意释放未与分配的预期对齐方式对齐的内存。
在C++中,我们使用new运算符动态分配内存。我的问题是,我们修改返回指针后,delete操作符能否知道从哪里开始删除呢?例如:
int (*a)[5] = new int[1][5];
a=a+1;
delete[] a;
没有。动态分配的内存只能使用分配返回的指针来释放。
之所以如此,是因为在实践中,分配器在指针returns之前存储分配元数据(因此它知道如何适当地释放它)。如果你在分配的后面传递给它一个指针,它会尝试读取前面的字节作为分配元数据,但当然它不是分配器元数据,它是你放在那里的任何随机数据。
还有其他分配策略 可能 避免将分配元数据放在那里(位字段等),但这些情况不太常见,而且通常仍然无法处理任意释放未与分配的预期对齐方式对齐的内存。