c ++ 11新功能,正确使用shared_ptr?

pic*_*ips 3 c++ smart-pointers shared-ptr c++11

所以我的理解是,当对象的最后一个剩余所有者被销毁或重新分配时,shared_ptr会自动从内存中释放出来(看起来太好了?)当许多实例可能共享同一个对象时它很有用.正确?

所以在我的情况下,我正在制作一个2d平铺世界,所以我在屏幕上绘制了许多相同的纹理.

我有

std::map<int, shared_ptr<Tile>> Tiledb;
Run Code Online (Sandbox Code Playgroud)

存储所有瓷砖.我的想法是只加载一次纹理,然后我可以根据需要多次渲染它.然后一旦游戏结束,我就打电话

Tiledb.clear();
Run Code Online (Sandbox Code Playgroud)

这会自动释放所有内存吗?我很习惯于常规指针,这看起来很神奇,坦率地说,太容易了.我认为它是如何工作的我错了吗?使用shared_ptrs有什么缺点吗?哈哈,我感到很惊讶.

感谢您提供任何信息.

Gal*_*lik 8

...当许多实例可能共享同一个对象时,它很有用.正确?

不完全是.当许多实例可能拥有相同的对象时,它很有用.共享不足以证明使用a std::shared_ptr是合理的,因为使用它肯定会有一些开销.

当您创建动态资源时,您需要考虑所有权,即.谁负责删除它?应该负责删除资源的对象应该使用某种智能指针(或容器)来管理资源.

如果只有一个对象负责决定何时必须删除资源,那么使用a std::unique_ptr.如果其他对象/函数需要共享对资源的访问权限,但永远不负责删除它,那么将它们传递给资源的引用原始指针.

使用a的时间std::shared_ptr是当您无法知道共享资源的哪些对象将是需要删除它的对象时.在这种情况下,每个对象应该通过持有a来拥有资源的所有权std::shared_ptr.

即使多个对象通过a 共享所有权,std::shared_ptr它们仍应仅将引用原始指针传递给不需要所有权的对象/函数.

std::stared_ptr绕过willy-nilly(不需要它们)的另一个问题是它们可能遭受Java内存泄漏问题.这就是对象永远不会死的原因,因为对它们的一些引用仍然存在于软件中被遗忘的部分.他们可以逐渐积累并消耗你的记忆.

通常,您应该更喜欢将资源保存在容器中,如:std::vectorstd::map:

std::map<int, Tile> Tiledb;
Run Code Online (Sandbox Code Playgroud)

容器管理的破坏Tile,从而不再需要一个智能指针.

但是,如果您使用多态 Tile对象,则需要使用指针存储它们.对于这个更喜欢使用std::unique_ptr:

// When the Tiles are no longer needed after the map is destroyed
std::map<int, std::unique_ptr<Tile>> Tiledb;
Run Code Online (Sandbox Code Playgroud)

如果其他对象需要在地图被销毁继续访问Tile对象,那么可能是合适的:std::shared_ptr

// only when Tiles need to keep living after the map is destroyed.
std::map<int, std::shared_ptr<Tile>> Tiledb; 
Run Code Online (Sandbox Code Playgroud)