我在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;
谢谢,我有点糊涂了!
发布于 2014-10-01 18:49:35
对于所显示的用法,虽然unique_ptr
比原始指针更好,因为它指示分配的资源的所有权,但您可能根本不应该使用任何类型的指针。相反,只需声明一个本地:
GameManager game;
game.Start();
如果必须将所有权赋予其他东西,而unique_ptr
的所有权可以很容易地转移,这可能是不够的。
发布于 2014-10-01 17:35:40
除了unique_ptr
的单一所有权之外,还有一些情况是共享的,或者很难定义所有权。在这些情况下,shared_ptr
提供引用计数,最后一个所有者将删除引用。
在shared_ptr
可能涉及复杂引用循环的情况下,标准还提供了weak_ptr
。
所有这些都取代了旧的auto_ptr
。
发布于 2014-10-02 09:38:23
不,不要完全替换所有的原始指针。
使用智能指针(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());
}
如果ShowCredits依赖于游戏总是有效的(也就是说,它不能随意地有一个值为nullptr),那么在这种情况下,如果参数为GameManager&类型,您可能会更好。
https://stackoverflow.com/questions/26076921
复制相似问题