我有一个像这样的漏洞代码:
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(),但这是一个非常混乱的解决方案 .
我想知道标准库中是否有适合我目标的智能指针,或者在我的情况下是否有一个想法或常见的技巧怎么办或者我可能遗漏了什么?
3 回答
只需更多代码,您就可以保留本地非拥有视图:
我不明白你对
g
取得所有权的意思,因为在g
退出后你仍然会使用指针 . 如果你总是想在g
之后使用指针,那么将原始指针传递给g
并在块的末尾解除分配指针会更有意义 .如果你确实希望
g
取得所有权,并且只想在指针仍然存在的情况下调用SomeMethod
,则将原始指针传递给g
并让它返回一个原始指针 . 如果指针在g
中被取消分配,则返回nullptr
并在SomeMethod
调用之前检查该指针 .您可以使用
shared_ptr
具有相同的效果 .shared_ptr
没有release()
函数,但它有一个reset()
函数,这是我认为你正在寻找的 . 但是,您必须等到调用SomeClass::SomeMethod()
后才能调用sc.reset()
.