繁体   English   中英

C ++模板函数删除和重置指针

[英]C++ template function to delete and reset pointers

我只是遇到了一个关于指针的小问题。 因为我希望有一种快速简便的方法可以在一行中完成此任务:

...
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是比使该指针无效的更安全的方法。

但是,如果您确实需要按照我的要求进行操作,则以下代码可以解决问题:

template <typename T>
inline void pDelete(T*& pointer) {
  if (pointer) {
    delete pointer;
    pointer = 0;
  }
}

但是,即使正确删除所有实例上的指针并使该指针无效(使用快速测试显示),这通常也不安全。

感谢大家提供的有益答案!

您正在寻找的解决方案是:

delete pointer;
pointer = nullptr;

是的,只需内联编写该代码。 确实没有必要在其他地方引入另一个功能模板,人们只需要保存一行代码就可以查明其实际功能。

上面的内容完全可读且易于理解。

您试图做的整个事情都没有意义。 您是否考虑过这种不自动发生的原因? 为什么运行时删除后指针不无效? 因为C ++标准委员会还不够聪明?

不,因为它在大多数时候对您没有好处。 是的,您使指针的该实例无效-但是使指针开始的整个原因很可能是该指针位于其他位置良好! (当然也有例外)。 结果,对指针的此实例进行的所有不正确访问(但对其他任何实例均无效)将使您从中摆脱出来。 本质上,它给您错误的安全感。

不要使用错误的安全感,而应该使用自动指针std::unique_ptr应该是首选,如果不够,请使用std::shared_ptr但要确保您确实需要它!

停止使用原始指针表示所有权。 如果通过指针获得对象的所有权,则应将其放入std::unique_ptr

然后,您的情况就是pointer.reset()

如果要让其他代码观察您所拥有的对象,而又不转移所有权,则可以使用pointer.get()获取非所有者指针。 您也可以使用*pointer获得参考。

如果您必须通过使用原始指针的接口传递所有权(我在看Qt),请使用pointer.release()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM