c++ - 删除共享指针

标签 c++ shared-ptr

我有一个指向 QScriptEngine 的指针,我正在通过类 Evaluator 的重载类构造函数并将其分配给 QScriptEngine *engine_(类 Property 子类 Evaluator,并调用此 Evaluator 的构造函数,将其传递给已分配的 QScriptEngine)。没有参数的构造函数创建新的 QScriptEngine 指针(类 Generic 子类 Evaluator 以这种方式)。在析构函数中,我测试 engine_ 是否不是 NULL,删除指针,然后将其分配给 NULL。派生的 Property 中的指针 (engine_) 现在是否也应为 NULL?有些东西告诉我事实并非如此。如果没有,你如何处理这种情况?我需要 QScriptEngine 始终是同一个实例。 QScriptEngine 的 = 运算符是私有(private)的,否则我会完全避免使用指针。

我在另一个 SO 问题中看到了一些关于共享指针的信息(boost::shared_ptrstd:tr1::shared_ptr)。我已经在正则表达式库中使用 boost,所以如果这是处理这个问题的最佳方法,那么 boost 也不是不可能的。希望对于一般的 C++ 知识和 future 的项目,有一种非提升的方式。

最佳答案

您可以通过为其中一个类(A 类)提供该指针的生命周期控制以及“getter”方法来解决此问题。另一个类(B 类)在需要指针时总是会调用 A 的 getter。这样,A 始终保持对指针的控制。缺点是 getter 函数(它可能会内联,但它仍然是第二个间接)。此外,B 将不得不在几乎每次使用时检查该指针是否为 NULL。

您的另一个选择是将指针包装在类似 boost::shared_ptr 的东西中,它通过持有底层指针来解决问题(如果使用得当),并且仅在删除共享该指针的所有对象时才删除它。您可以自己编写此代码,但由于您已经发挥了作用,我只使用他们的实现。

第三种选择是重构整个事物,这样就不需要共享指针了。我个人从来没有设计过需要共享指针的 C++ 程序,只是因为多年来内存管理错误很容易潜入这个地方,但我就是这样。

关于c++ - 删除共享指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1647621/

相关文章:

c++ - 您是否应该能够从 T 具有非平凡构造函数的 std::optional<T> 移动?

c++ - std::vector::erase()(多线程) 'Assertion ` px != 0' failed.'

c++ - 如何保持常量正确性和 RAII?

c++ - 多态性和类型转换

c++ - 在 C++ 中,我可以使用多线程工具将 UNIX 信号与我的主程序同步吗?

c++ - 通过2层方法传递shared_ptr?

c++ - 在 C++ 中使用 enable_shared_from_this 时检查现有的 shared_ptr?

c++ - 删除具有 protected 析构函数的对象

c++ - 禁用覆盖警告 C++

c++ - 类似于 Linux 上的 .dll - 如何获取它们?