首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++ 11智能指针使用

C++ 11智能指针使用
EN

Stack Overflow用户
提问于 2014-09-27 16:47:04
回答 3查看 6.5K关注 0票数 6

我在c++ 11中有一个关于智能指针的问题,我开始看C++ 11 (我通常用c#编写程序),并阅读一些关于智能指针的内容。现在我有一个问题,智能指针是否完全取代了指针的“旧”风格,我应该一直使用它们吗?

unique_ptr似乎解决了C++中内存管理的所有问题,或者我错了吗?

例如:

代码语言:javascript
运行
复制
std::unique_ptr<GameManager> game (new GameManager());

game->Start();

似乎比:

代码语言:javascript
运行
复制
auto *game2 = new GameManager();

game2->Start();

delete game2;

谢谢,我有点糊涂了!

EN

回答 3

Stack Overflow用户

发布于 2014-10-01 18:49:35

对于所显示的用法,虽然unique_ptr比原始指针更好,因为它指示分配的资源的所有权,但您可能根本不应该使用任何类型的指针。相反,只需声明一个本地:

代码语言:javascript
运行
复制
GameManager game;
game.Start();

如果必须将所有权赋予其他东西,而unique_ptr的所有权可以很容易地转移,这可能是不够的。

票数 11
EN

Stack Overflow用户

发布于 2014-10-01 17:35:40

除了unique_ptr的单一所有权之外,还有一些情况是共享的,或者很难定义所有权。在这些情况下,shared_ptr提供引用计数,最后一个所有者将删除引用。

shared_ptr可能涉及复杂引用循环的情况下,标准还提供了weak_ptr

所有这些都取代了旧的auto_ptr

票数 3
EN

Stack Overflow用户

发布于 2014-10-02 09:38:23

不,不要完全替换所有的原始指针。

使用智能指针(unique_ptr、shared_ptr)只对那些拥有和管理指针内存的指针非常有用。但是,如果函数将指针作为参数,则不希望传递所有权。函数只需要访问指针。

代码语言:javascript
运行
复制
void ShowCredits(GameManager* game)   // Just use game, don't take ownership.
{                                     // A raw pointer here is good.
   // ...
}

void main()
{
    auto game = make_unique<GameManager>(); // game owns the GameManager.
    game->Start();
    ShowCredits(game.get());
}

如果ShowCredits依赖于游戏总是有效的(也就是说,它不能随意地有一个值为nullptr),那么在这种情况下,如果参数为GameManager&类型,您可能会更好。

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

https://stackoverflow.com/questions/26076921

复制
相关文章

相似问题

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