首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将从方法返回的原始指针存储到智能指针中。

将从方法返回的原始指针存储到智能指针中。
EN

Stack Overflow用户
提问于 2017-10-10 17:18:02
回答 4查看 4.6K关注 0票数 7

场景:

我使用的方法来自旧的C++库,它返回指向SomeClass的原始指针,其中SomeClass是从库头导出的类,例如SomeClass.h

以下是我正在使用的LibraryMethod的签名:

代码语言:javascript
复制
SomeClass* LibraryMethod();

我没有权利改变图书馆。我只使用二进制和公共标题,这是一个典型的场景。

我不想在代码中使用原始指针。因此,我在代码的一部分中使用了库API,其中有一个共享指针SomeClass

代码语言:javascript
复制
std::shared_ptr<SomeClass> some_class;

这样初始化,以避免存储指向SomeClass的原始指针。

代码语言:javascript
复制
some_class = (std::shared_ptr<SomeClass>)LibraryMethod();

这基本可行,但我想了解这里的细节。

问题:

以上是正确的技术吗?

我在这里造成了泄漏吗?

有什么更好的技术来处理这种情况吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-10-10 17:19:51

你应该把它叫做

代码语言:javascript
复制
auto some_class = std::shared_ptr<SomeClass>(LibraryMethod());

这假设LibraryMethod正在分配指针,并将内存的所有权交给您。

正如目前所写的,您正在尝试使用C样式的强制转换(这可能导致一个std::shared_ptr )来转换指向一个reinterpret_cast的原始指针。相反,您希望使用返回的原始指针进行std::shared_ptr

票数 10
EN

Stack Overflow用户

发布于 2017-10-10 17:27:45

在您的示例中,正确的方法应该是使用shared_ptr构造函数:

代码语言:javascript
复制
std::shared_ptr<SomeClass> sPtr(LibraryMethod());

但是首先您应该知道LibraryMethod()返回的指针真正意味着什么,大多数库返回原始指针只是为了说“嗨,您可以通过这个指针访问这个对象,但是请注意,我仍然是负责管理它的人,所以.不要删除它!”

如果您确信在该调用之后,您将负责管理它,那么您可以使用shared_ptr来保持头脑的平静。

票数 4
EN

Stack Overflow用户

发布于 2017-10-10 17:22:07

代码有效,但它又丑又脆弱。为什么要把漂亮的现代C++ (智能指针)和像C风格的角色一样古老和危险的东西混合在一起呢?你最好打电话给reset

代码语言:javascript
复制
some_class.reset(LibraryMethod());

以上假设(您的问题似乎表明)您已经在某个地方声明了std::shared_ptr<SomeClass> some_class;,并希望重新分配它。如果在调用some_class之前创建LibraryMethod,那么最好直接初始化它:

代码语言:javascript
复制
std::shared_ptr<SomeClass> some_class(LibraryMethod());

这相当于科利克莱默的回答

但是,请注意,在所有这些代码中都隐藏了一个很大的假设:LibraryMethod返回一个指向通过new动态分配的内存的指针,其调用方负责通过调用delete最终释放该内存。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46672402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档