【问题标题】:Why is it allowed to deallocate memory using pointer to const in C++? [duplicate]为什么允许在 C++ 中使用指向 const 的指针释放内存? [复制]
【发布时间】:2011-05-12 06:43:53
【问题描述】:

可能重复:
Deleting a pointer to const (T const*)

让我们看一下这行代码:

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 说你不能改变指向的对象。你没有,你只是让它消失!
  • 我也有类似的疑问..看到这个问题:stackoverflow.com/questions/755196/…
  • 但是free 不能释放const 指针。它的签名是free(void*),而不是free(void const*)

标签: c++ pointers constants


【解决方案1】:
const T* p = new T();
// uh oh; how do I destroy the object pointed to by 'p'?

【讨论】:

  • 你自相矛盾。在最初的问题中,您说“我们无法使用y 修改数据。”这里你说我们其实可以修改y(通过使用const_cast<char*>(y)[1] = 'd';.
  • 我认为您真正要问的是“为什么对象的破坏不被视为对象的修改?”除了如果我们不能销毁 const 限定的对象会很尴尬(充其量)这一事实之外,我认为可以公平地说销毁不是修改,因为一旦对象被销毁,它就不再存在:没有办法观察对象被修改,因为根本无法观察对象。
  • 不@James 我回答了你的问题how do I destroy the object pointed to by 'p'?。而且我认为创建一个对象并将其分配给指向 const 的指针并不是一件好事,这很少需要安静。
  • 假设delete p; 格式错误,其中pconst T*。您的断言是您仍然可以使用delete const_cast<T*>(p); 销毁p 指向的对象。我的观点是,如果你这么说,那么说你实际上可以使用const_cast<T*>(p) 修改p 指向的数据同样合理。
  • @James 我们都知道,在 c++ 中 const 不是逻辑常量,而是物理常量,我们应该编写这样的代码使其符合逻辑。所以我认为不允许通过指向 const 的指针删除内存更“物理”。
【解决方案2】:

如果你不能,你就不能写出这样的东西:

const std::string name = "fred";

【讨论】:

    【解决方案3】:

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

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

    您可以将其视为记忆的“视图”。可能还有其他非 const 视图。 delete 对实际数据进行操作,而不是“视图”。

    【讨论】:

    • "delete 对实际数据进行操作,而不是对“视图”进行操作。"你是说修改只作用于视图而不作用于实际数据?
    • 不,我是说类型只在你想修改数据时才重要,delete 不关心类型,只关心底层内存。删除不会修改任何东西,它会破坏它。
    【解决方案4】:

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

    (const char * y = x; 表示你不能改变y的值,因为被声明为常量。如果声明为:char *const y=x,你可以改变y的值但不能他的地址) 和平

    【讨论】:

    • 这一切都是真的,但与问题无关。
    猜你喜欢
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    相关资源
    最近更新 更多