【问题标题】:Deleting C++ pointers删除 C++ 指针
【发布时间】:2018-05-14 20:41:06
【问题描述】:

据我了解

Ptr* p = new Ptr();

应该 delete p; p = 0。我不清楚在以下情况下该怎么做:

Ptr* p = obj.GetPtr()

我读到我不应该delete p,因为这可以lead to adverse effects。如果函数 GetPtr() 本身 news 有一些指针,但 delete 没有呢?

【问题讨论】:

  • 由函数的文档来告诉你该做什么。没有人能猜出正确的做法是什么。也许一个暗示性的函数名可以给你一个提示。这是拥有原始指针通常不好的另一个原因。
  • 哈姆雷特写C++时
  • 承受悬空指针的星矢是否是心灵的高尚
  • @vinpa 有几个原因。一方面,悬空指针传达了指针用于引用对象的信息。除非您知道在该特定情况下这样做是安全的,否则您无法销毁该信息。另一方面,它往往会导致代码假定非 NULL 指针可以安全地取消引用,如果指针被传递,这通常是不安全的。 (考虑两个指向同一个对象的指针并在其中一个上调用delete。另一个是非NULL,但访问它是不安全的。你不能使用“它不是NULL”来表示它是安全的访问。)
  • 更清楚一点:要么没有代码访问该值,要么某些代码访问了该值。如果没有代码访问该值,则将该值设置为零不会有任何效果。如果某些代码确实访问了该值,那么它会关心该值是什么,并且它是什么很重要。因此,将其设置为 NULL 可能有助于该代码,也可能会破坏该代码,具体取决于代码是否需要知道指针现在指向有效对象还是先前指向有效对象。所以你需要仔细决定,在这种情况下,指针是否应该设置为 0。所以不可能有一个普遍的政策,。

标签: c++ pointers


【解决方案1】:

在现代 C++ 中,约定是 原始指针非拥有 指针 - 因此您编写的代码和遵循现代约定的库不应要求原始指针指向是deleted。

为了表达堆分配对象的所有权,使用智能指针代替std::unique_ptrstd::shared_ptr。这些指针会在适当的时候自动为您调用delete

相关核心指南: "Never transfer ownership by a raw pointer (T*) or reference (T&)".


在您的特定情况下:

我不清楚在以下情况下该怎么做:

Ptr* p = obj.GetPtr()
  1. 假设 p非拥有的,因为它是一个原始指针

  2. 如果您使用的是旧版库,请查看 obj.GetPtr() 的文档。如果需要deleted,文档中应该会提到。

【讨论】:

  • 更大的教训是,任何时候你有一些东西指向一个对象(无论是原始指针、引用、智能指针还是其他),都应该清楚地了解对象的生命周期是托管的。
  • 在情况 (2) 中,您可能想使用std::unique_ptr<Ptr> p = obj.GetPtr();
  • Romeo:你能详细说明一下所有权吗?
  • @M.M 那不会编译。
  • @M.M: std::unique_ptr<Ptr> p(obj.GetPtr());,但同样,前提是调用者应该是deleteGetPtr()返回的指针
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2021-07-30
  • 2011-09-18
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多