Wes*_*Wes 1 c++ pointers memory-management smart-pointers
我一直在阅读智能指针,最近在课堂上我的TA说我们永远不应该使用原始指针.现在,我已经在网上做了很多阅读,并在这个网站上查看了不同的问题,但我仍然对智能指针的某些方面感到困惑.我的问题是:如果我希望在我的程序中使用它,我会使用哪个智能指针?我会展示一些代码.
所以我有一个基本的Application类,它从类AI中声明对象的声明.注意:出于测试原因,我有两个不同的智能指针,一个是唯一的,另一个是共享的.
// Application class in Application.h
class Application
{
public:
Application(){}
~Application(){}
//... additional non-important variables and such
unique_ptr<AI> *u_AI; // AI object using a unique pointer
shared_ptr<AI> *s_AI; // AI object using a shared pointer
//... additional non-important variables and such
void init();
void update();
};
// AI class in AI.h
class AI
{
public:
AI(){}
~AI(){}
bool isGoingFirst;
};
Run Code Online (Sandbox Code Playgroud)
在Application init函数中,我想创建AI对象,然后我想在更新函数中使用它.我不确定我是否正确地声明我的指针,但我知道它编译的事实,它适用于在init函数中分配和打印数据.更多代码如下.
void Application::init()
{
//.. other initialization's.
std::shared_ptr<AI> temp(new AI());
sh_AI = &temp;
sh_AI->isGoingFirst = true;
//.. other initialization's.
// Function ends.
}
void Application::update()
{
if(sh_AI->get()->isGoingFirst == true)
{
// Do something
}
else
{
// Do something else
}
// Other code below
}
Run Code Online (Sandbox Code Playgroud)
稍后在我的程序中,调用更新函数,它使用我在类Application中声明的相同AI智能指针.我发现的是智能指针AI对象正在被删除.我知道智能指针有自动内存管理,但是有一个智能指针,允许你在不同的功能中使用它而不会产生任何重大问题,如内存泄漏或悬空引用?或者我错过了智能指针的全部内容?
如果在另一个问题中回答这个问题我很抱歉,但是我读了很多其他问题,虽然我对智能指针有了更多的了解,但我还在学习.谢谢!
正如Neil Kirk在评论中指出的那样,这些声明不是你想要的:
unique_ptr<AI> *u_AI; // AI object using a unique pointer
shared_ptr<AI> *s_AI; // AI object using a shared pointer
Run Code Online (Sandbox Code Playgroud)
u_AI和s_AI仍然是原始指针的对象.重点是消除直接管理原始指针的需要.所以现在用以下代替它们:
unique_ptr<AI> u_AI; // AI object using a unique pointer
shared_ptr<AI> s_AI; // AI object using a shared pointer
Run Code Online (Sandbox Code Playgroud)
要分配您创建的指针,请使用函数make_unique或make_shared:
u_AI = unique_ptr<AI>(new AI()); // Yu may be able to use make_unique like
// make_shared but it's new to C++14. may not be available
s_AI = make_shared<AI>();
Run Code Online (Sandbox Code Playgroud)
然后,当你需要访问它们时,你只是假装它们是指针,所以在你的更新函数中:
if(sh_AI->get()->isGoingFirst == true)
Run Code Online (Sandbox Code Playgroud)
变为:
if(sh_AI->isGoingFirst == true)
Run Code Online (Sandbox Code Playgroud)
至于何时使用unique_ptr vs shared_ptr,你可以通过回答以下问题来回答:当有人复制时,我想要发生什么Application?即:
Application app1;
app1.init();
Application app2 = app1; // ?? what happens to AI object in app2?
Run Code Online (Sandbox Code Playgroud)
有3种可能的答案:
我不希望有任何应用程序的副本.(这对于名为Application的类来说是有意义的).在这种情况下,它并不重要(在这种情况下,我将默认为unique_ptr)并删除复制构造函数:
应用程序(const Application&)=删除;