【发布时间】:2014-09-25 05:39:11
【问题描述】:
我有一个这样的泄漏代码:
void f() {
SomeClass *sc = new SomeClass;
...
if (...) {
g(sc); // g() takes ownership of memory pointed to by sc
}
...
sc->SomeMethod();
...
}
我想通过使用智能指针来消除泄漏,想到了以下解决方案:
void f() {
smart_ptr<SomeClass> sc(new SomeClass);
...
if (...) {
g(sc.release()); // ownership is taken
}
...
sc->SomeMethod(); // sc points to the allocated memory regardless of whether ownership was taken or not
...
} // the memory is freed if ownership was not taken
尝试使用 std::unique_ptr 和 std::shared_ptr。 std::unique_ptr 指向释放后的空指针, std::shared_ptr 根本没有 release() 。手动增加 std::shared_ptr 的引用计数器会有所帮助,但据我所知,也没有这样的能力。
除了原始指针保持原样保留代码并且每次将原始指针传递给获得所有权的函数时调用 release() 之外,还考虑使用 std::unique_ptr,但这是一个非常混乱的解决方案。
我想知道标准库中是否有适合我目标的智能指针, 或者在我的情况下可能有一个理念或常见的技巧,或者我可能遗漏了什么?
【问题讨论】:
-
只需使用
unique_ptr和原始指针,这是最简单的解决方案。在通过原始指针调用SomeMethod()之前,您确实需要确保g()不是delete对象。 -
是的,解决方案最简单但容易出错。代码是开源的,我想使用一个变量。
f()的实体很大,指针使用频繁,所有权多次转让。
标签: c++ c++11 smart-pointers