C ++ 11智能指针使用

时间:2014-09-27 16:47:04

标签: c++ pointers c++11 smart-pointers unique-ptr

我对c ++ 11中的智能指针有疑问。我已经开始看看C ++ 11(我通常用c#编程)并阅读有关智能指针的一些内容。现在我有了问题,智能指针是否完全取代了“旧”指针样式,我应该总是使用它们吗?

unique_ptr似乎解决了C ++内存管理的所有问题,还是我错了?

例如:

std::unique_ptr<GameManager> game (new GameManager());

game->Start();

似乎比以下更聪明:

auto *game2 = new GameManager();

game2->Start();

delete game2;

谢谢,我有点困惑!

4 个答案:

答案 0 :(得分:10)

对于显示的用法,虽然unique_ptr优于原始指针,因为它表示已分配资源的所有权,但您可能根本不应使用任何类型的指针。而只是声明一个本地:

GameManager game;
game.Start();

如果必须将所有权提供给其他人,这可能是不够的,而unique_ptr的所有权很容易转移。

答案 1 :(得分:7)

回答你的问题:是的,他们确实解决了内存管​​理问题。

尽可能使用它们被认为是好的风格。

它们消除了许多可能的编程错误,并降低了使用指针创建正确代码的难度。

更进一步,改变

是件好事
std::unique_ptr<GameManager> game (new GameManager());

要:

std::unique_ptr<GameManager> game (std::make_unique<GameManager>());

答案 2 :(得分:3)

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

shared_ptr可能涉及复杂参考循环的情况下,该标准还提供weak_ptr

所有这些都取代了旧auto_ptr

答案 3 :(得分:3)

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

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

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());
}

P.S。如果ShowCredits依赖游戏始终有效(即它不能选择具有nullp值),那么在这种情况下,参数的类型为GameManager&amp;可能会更好。