【发布时间】: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。所以不可能有一个普遍的政策,。