我有一个像这样的泄漏代码:
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的引用计数器会有所帮助,但正如我正确理解的那样,没有这样的能力。
除了原始指针之外,我还考虑使用std::unique_ptr,使代码保持原样,每次将原始指针传递给取得所有权的函数时只调用release(),但这是一个非常混乱的解决方案。
我想知道是否有一个智能指针从标准库适合我的目标,或者也许有一个想法或常见的技巧如何做在我的情况下,或者我可能遗漏了什么?
您可以保留本地的非所有者视图,只需多用一点代码:
void g(std::unique_ptr<Foo> p); // takes ownership
int main()
{
auto p = std::make_unique<Foo>();
Foo & local_view = *p;
if (/* condition */) { g(std::move(p)); }
local_view.do_stuff();
}
我不理解您关于
如果您确实希望
您可以使用
void g(shared_ptr<SomeClass> ptr);
void f()
{
shared_ptr<SomeClass> sc(new SomeClass);
if (/* check for condition */)
{
g(sc);
}
sc->SomeMethod();
sc.reset();
}