gpt4 book ai didi

c++ - 从智能指针获取所有权,并通过同一智能指针进一步访问原始指针

转载 作者:行者123 更新时间:2023-11-28 00:25:57 28 4
gpt4 key购买 nike

我有这样一个漏洞代码:

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(),但这是一个非常困惑的解决方案。

我想知道标准库中是否有适合我目标的智能指针,或者在我的情况下可能有一个理念或常见的技巧,或者我可能遗漏了什么?

最佳答案

只需多一点代码,您就可以保留一个本地的、非拥有的 View :

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();
}

关于c++ - 从智能指针获取所有权,并通过同一智能指针进一步访问原始指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25090028/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com