为什么允许在C++中使用指向 const 的指针来释放内存

Why is it allowed to deallocate memory using pointer to const in C++?

本文关键字:const 指针 内存 释放 C++ 为什么      更新时间:2023-10-16

可能的重复项:
删除指向常量的指针 (T 常量*)

让我们看一下这几行代码:

char * x = new char [2];
x[0] = 'a'; // OK
x[1] = 'b'; // we can modify data using x
const char * y = x; 
y[0] = 'c'; // Error
y[1] = 'd'; // we can't modify data using y
delete [] y; //but we can deallocate memory (i.e. delete data) using y

因此,在我看来,更自然的是限制无法使用 const 指针来释放内存。为什么没有这样的限制?

const T* p = new T();
// uh oh; how do I destroy the object pointed to by 'p'?

如果你不能,你将无法编写如下内容:

const std::string name = "fred";

一个更好的问题是为什么你不能解除分配? 您要求限制,但该限制解决了什么问题。 它真的对您的代码有帮助还是只是妨碍您?

const 可防止您修改可能不应该修改的数据。 请记住,删除将摆脱内存。 您的 const 指针仍将指向相同的地址,如果您尝试修改删除后的任何数据,它仍然会抱怨。 这取决于你不指向已删除的内存。

你可以把它看作是记忆的"视图"。 可能还有其他观点是不可思议的。 删除操作的是实际数据,而不是"视图"。

因为您使用 NEW 分配内存,因此数据存储在堆区域中,因此可以使用 DELETE 语句。Y 指向堆内存区域中的 x。

(常量字符 * y = x; 这意味着您无法更改 y 的值,因为 被声明为常量。如果声明:char *const y=x,您可以更改 y 的值,但不能更改他的地址)和平