我一直在阅读智能指针,最近在课堂上,我的助教说我们不应该使用原始指针。现在,我在网上读了很多书,在这个网站上查看了不同的问题,但我仍然对智能指针的某些方面感到困惑。我的问题是:如果我希望在我的程序中使用它,我会使用哪个智能指针?我会给你看一些代码。
所以我有一个基本的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;
};
在Application函数中,我希望创建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
}
稍后在我的程序中,会调用update函数,它使用与我在类应用程序中声明的相同的AI智能指针。我发现智能指针AI对象被删除了。我理解智能指针具有自动内存管理功能,但是是否有一个智能指针可以让您在不同的函数中使用it,而不会产生任何重大问题,例如内存泄漏或悬空引用?还是我错过了智能指针的全部要点?
如果在另一个问题中回答了这个问题,我很抱歉,但是我读了很多其他的问题,虽然我对智能指针有更多的了解,但我仍然在学习。谢谢!
发布于 2014-10-20 20:23:47
简单回答:由于指针是公共的,我建议您使用shared_ptr
。但是,您的指针不需要是公共的,所以如果它是私有的,您可以使用unique_ptr
,因为您只在自己的实例中使用它。
但事实是,这并不重要(我知道我会在这方面得到一些支持)。使用unique_ptr
有两个原因:
另一方面,如果您需要共享指针(即使是只读方式),则必须使用shared_ptr
。
很多时候,首先使用shared_ptr
更方便,但出于上述原因,使用unique_ptr
是值得的。
没有理由使用unique_ptr
:性能。我只说make_shared
。
现在开始你的代码
以下是定义智能指针的方式:
std::shared_ptr<AI> s_AI;
std::unique_ptr<AI> u_AI;
您是这样初始化它的:
s_AI = std::make_shared<AI>(); // or
s_AI = std::shared_ptr<AI>(new AI);
u_AI = std::unique_ptr<AI>(new AI);
请注意,std::make_unique在C++11中是没有的,它将在C++14中,编写一个替代版本并不那么困难,但事实上,在C++11中没有。
下面是使用指针的方式:
s_AI->isGoingFirst;
就是这样,它的行为就像一个普通的指针。只有当您必须将它传递给需要指针的函数时,才需要使用.get()
。
下面是如何删除(空)指针:
s_AI.reset();
再次,我建议你让你的指针私密。如果需要传递它,请确保使用shared_ptr
并编写getter方法:
std::shared_ptr<AI> getAI() const {
return s_AI;
}
请记住,如果您这样做,您不能假设您的AI对象将被销毁时,您的应用程序对象是。
https://stackoverflow.com/questions/26473733
复制相似问题