首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用智能指针作为类成员

使用智能指针作为类成员
EN

Stack Overflow用户
提问于 2014-10-20 19:49:26
回答 1查看 7.2K关注 0票数 1

我一直在阅读智能指针,最近在课堂上,我的助教说我们不应该使用原始指针。现在,我在网上读了很多书,在这个网站上查看了不同的问题,但我仍然对智能指针的某些方面感到困惑。我的问题是:如果我希望在我的程序中使用它,我会使用哪个智能指针?我会给你看一些代码。

所以我有一个基本的Application类,它可以从类AI中声明对象。注意:出于测试原因,我有两个不同的智能指针,一个是唯一的,另一个是共享的。

代码语言:javascript
运行
复制
// 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函数中的数据。下面是更多的代码。

代码语言:javascript
运行
复制
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,而不会产生任何重大问题,例如内存泄漏或悬空引用?还是我错过了智能指针的全部要点?

如果在另一个问题中回答了这个问题,我很抱歉,但是我读了很多其他的问题,虽然我对智能指针有更多的了解,但我仍然在学习。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2014-10-20 20:23:47

简单回答:由于指针是公共的,我建议您使用shared_ptr。但是,您的指针不需要是公共的,所以如果它是私有的,您可以使用unique_ptr,因为您只在自己的实例中使用它。

但事实是,这并不重要(我知道我会在这方面得到一些支持)。使用unique_ptr有两个原因:

  1. 它永远不会离开您的模块,您只需要替换一个裸指针。
  2. 您希望显式地显示它不应该离开您的模块。

另一方面,如果您需要共享指针(即使是只读方式),则必须使用shared_ptr

很多时候,首先使用shared_ptr更方便,但出于上述原因,使用unique_ptr是值得的。

没有理由使用unique_ptr:性能。我只说make_shared

现在开始你的代码

以下是定义智能指针的方式:

代码语言:javascript
运行
复制
std::shared_ptr<AI> s_AI;
std::unique_ptr<AI> u_AI;

您是这样初始化它的:

代码语言:javascript
运行
复制
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中没有。

下面是使用指针的方式:

代码语言:javascript
运行
复制
s_AI->isGoingFirst;

就是这样,它的行为就像一个普通的指针。只有当您必须将它传递给需要指针的函数时,才需要使用.get()

下面是如何删除(空)指针:

代码语言:javascript
运行
复制
s_AI.reset();

再次,我建议你让你的指针私密。如果需要传递它,请确保使用shared_ptr并编写getter方法:

代码语言:javascript
运行
复制
std::shared_ptr<AI> getAI() const {
    return s_AI;
}

请记住,如果您这样做,您不能假设您的AI对象将被销毁时,您的应用程序对象是。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26473733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档