【发布时间】:2014-10-20 19:49:26
【问题描述】:
我一直在阅读智能指针,最近在课堂上我的助教说我们不应该使用原始指针。现在,我在网上做了很多阅读并查看了这个网站上的不同问题,但我仍然对智能指针的某些方面感到困惑。我的问题是:如果我希望在我的程序中使用它,我会使用哪个智能指针?我会展示一些代码。
所以我有一个基本的应用程序类,它从类 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 init函数中,我想创建AI对象,然后我想在update函数中使用它。我不确定我是否完全正确地声明了我的指针,但我知道它可以编译并且它可以在 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
}
稍后在我的程序中,调用了更新函数,它使用了我在类 Application 中声明的相同 AI 智能指针。我发现智能指针 AI 对象正在被删除。我知道智能指针具有自动内存管理功能,但是是否有一个智能指针可以让您在不同的功能中使用它而不会产生任何重大问题,例如内存泄漏或悬空引用?还是我错过了智能指针的全部意义?
很抱歉,如果在另一个问题中回答了这个问题,但我阅读了很多其他问题,虽然我对智能指针有更多了解,但我仍在学习。谢谢!
【问题讨论】:
-
unique_ptr<AI> *u_AI是指向智能指针的指针,这可能不是您想要的。在 init 函数中不需要临时指针,可以直接使用 reset 函数存储结果。 -
你的代码已经严重损坏了。您应该解决使用原始 dangling 指针的根本问题。我认为您需要先掌握基础知识。
-
所有规则都有例外,即使是这个...
-
恕我直言,您不应该一直使用智能指针。当您使用
newthen 创建对象时,您应该立即 将其放入智能指针中。在许多用例中,您可以安全地使用原始指针,因为知道它将在适当的时间自动删除。只有当您无法控制哪个对象最后使用指针时,您才需要使用shared_ptr。即便如此,只有指针的共享所有者需要在智能指针中保存一份副本。生命周期比拥有对象短的子作用域可以安全地使用原始指针。 -
智能指针应该用于所有权语义,而不是作为原始指针的替代品。
标签: c++ pointers memory-management smart-pointers