std :: make_shared里面的原始指针

Pho*_*rga 3 c++ pointers raii c++11

我很乐意继续学习C/C++中指针的精细笔记以及它们是如何工作的,但经过一些研究后,我对下面的代码感到不舒服.

std::shared_ptr<CDKSCREEN> cdkScreen;
cdkScreen = std::make_shared<CDKSCREEN>(*initCDKScreen(newWin.get()));
Run Code Online (Sandbox Code Playgroud)

内部原始指针的使用是否std::shared_ptr会使您使用智能指针获得的任何好处无效?或者两种方式都一样吗?谢谢你,我感谢这篇文章的任何答案.


编辑:我没有意识到该reset()功能的全部目的,但感谢所有向我指出这一点的人.看来我也可以传递自定义析构函数std::shared_ptr,如下所示:

std::shared_ptr<CDKSCREEN> cdkScreen(initCDKScreen(newWin.get()), destroyCDKScreen);
Run Code Online (Sandbox Code Playgroud)

Joj*_*GME 5

我想你想保存initCDKScreen返回的指针.在这种情况下,您不必使用make_shared.您应该将指针传递给构造函数或shared_ptr::reset(...):

std::shared_ptr<CDKSCREEN> cdkScreen(initCDKScreen(newWin.get()));
Run Code Online (Sandbox Code Playgroud)

既然CDKSCREEN应该被破坏destroyCDKScreen(CDKSCREEN *screen)而不是被破坏delete,你应该写下这样的东西:

std::shared_ptr<CDKSCREEN> cdkScreen(initCDKScreen(newWin.get()), destroyCDKScreen);
Run Code Online (Sandbox Code Playgroud)

要么

std::shared_ptr<CDKSCREEN> cdkScreen;
cdkScreen.reset(initCDKScreen(newWin.get()), destroyCDKScreen);
Run Code Online (Sandbox Code Playgroud)