我有一个指向 QScriptEngine
的指针,我正在通过类 Evaluator
的重载类构造函数并将其分配给 QScriptEngine *engine_
(类 Property
子类 Evaluator
,并调用此 Evaluator
的构造函数,将其传递给已分配的 QScriptEngine
)。没有参数的构造函数创建新的 QScriptEngine
指针(类 Generic
子类 Evaluator
以这种方式)。在析构函数中,我测试 engine_
是否不是 NULL
,删除指针,然后将其分配给 NULL
。派生的 Property
中的指针 (engine_
) 现在是否也应为 NULL
?有些东西告诉我事实并非如此。如果没有,你如何处理这种情况?我需要 QScriptEngine
始终是同一个实例。 QScriptEngine
的 = 运算符是私有(private)的,否则我会完全避免使用指针。
我在另一个 SO 问题中看到了一些关于共享指针的信息(boost::shared_ptr
和 std: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/