我对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;
谢谢,我有点困惑!
答案 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;可能会更好。