【发布时间】:2016-12-19 15:17:22
【问题描述】:
我刚刚遇到了一个关于指针的小问题。 因为我想用一种快速简便的方法在一行中完成这项任务:
...
delete pointer;
pointer = 0;
...
我只是快速设置了一个简单的头文件,其中包含一个接受任何类型指针的模板方法。它看起来像这样:
#ifndef P_DELETE_H
#define P_DELETE_H
template <typename T>
void pDelete(T* pointer) {
if (pointer) {
delete pointer;
pointer = 0;
}
}
#endif
但是,结果不符合我对删除对象和重置指针的期望。相反,似乎只删除了对象,但将其设置为零没有效果(这是我需要的)。如果这里有人可以减轻我的负担并解释这种行为,我会非常感谢!
更新:
正如答案所解释的,使用 std::unique_ptr 和 std::shared_ptr 是比取消 this 指针更安全的方法。
但如果你真的需要按照我的要求走,下面的代码就可以了:
template <typename T>
inline void pDelete(T*& pointer) {
if (pointer) {
delete pointer;
pointer = 0;
}
}
然而,这通常是不安全的,即使它正确地删除并取消了所有实例上的指针(快速测试揭示了这一点)。
感谢大家提供的信息丰富的答案!
【问题讨论】:
-
函数参数在函数范围内是本地的。这包括指针。您必须使用指针引用或指针指针来影响函数外部的值。 (或者停止使用原始指针,你就不需要这整件事了。)
-
使用智能指针库(如
std::unique_ptr)完全无需编写此类代码。 -
我支持智能指针方法。这种方法容易出错。例如,如果您传递一个使用
new[]分配的指针,您将有未定义的行为。 -
需要这样的编码技巧通常是糟糕设计的结果。
-
@Migsi 实际上
unqiue_ptr应该是默认访问。唯一的开销是删除调用,无论如何您都需要这样做,因此您不妨利用 RAII。
标签: c++ templates pointers delete-operator