场景:
我使用的方法来自旧的C++库,它返回指向SomeClass的原始指针,其中SomeClass是从库头导出的类,例如SomeClass.h
以下是我正在使用的LibraryMethod的签名:
SomeClass* LibraryMethod();我没有权利改变图书馆。我只使用二进制和公共标题,这是一个典型的场景。
我不想在代码中使用原始指针。因此,我在代码的一部分中使用了库API,其中有一个共享指针到SomeClass。
std::shared_ptr<SomeClass> some_class;这样初始化,以避免存储指向SomeClass的原始指针。
some_class = (std::shared_ptr<SomeClass>)LibraryMethod();这基本可行,但我想了解这里的细节。
问题:
以上是正确的技术吗?
我在这里造成了泄漏吗?
有什么更好的技术来处理这种情况吗?
发布于 2017-10-10 17:19:51
你应该把它叫做
auto some_class = std::shared_ptr<SomeClass>(LibraryMethod());这假设LibraryMethod正在分配指针,并将内存的所有权交给您。
正如目前所写的,您正在尝试使用C样式的强制转换(这可能导致一个std::shared_ptr )来转换指向一个reinterpret_cast的原始指针。相反,您希望使用返回的原始指针进行std::shared_ptr。
发布于 2017-10-10 17:27:45
在您的示例中,正确的方法应该是使用shared_ptr构造函数:
std::shared_ptr<SomeClass> sPtr(LibraryMethod());但是首先您应该知道LibraryMethod()返回的指针真正意味着什么,大多数库返回原始指针只是为了说“嗨,您可以通过这个指针访问这个对象,但是请注意,我仍然是负责管理它的人,所以.不要删除它!”
如果您确信在该调用之后,您将负责管理它,那么您可以使用shared_ptr来保持头脑的平静。
发布于 2017-10-10 17:22:07
代码有效,但它又丑又脆弱。为什么要把漂亮的现代C++ (智能指针)和像C风格的角色一样古老和危险的东西混合在一起呢?你最好打电话给reset
some_class.reset(LibraryMethod());以上假设(您的问题似乎表明)您已经在某个地方声明了std::shared_ptr<SomeClass> some_class;,并希望重新分配它。如果在调用some_class之前创建LibraryMethod,那么最好直接初始化它:
std::shared_ptr<SomeClass> some_class(LibraryMethod());这相当于科利克莱默的回答。
但是,请注意,在所有这些代码中都隐藏了一个很大的假设:LibraryMethod返回一个指向通过new动态分配的内存的指针,其调用方负责通过调用delete最终释放该内存。
https://stackoverflow.com/questions/46672402
复制相似问题