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有什么缺点吗?哈哈,我感到很惊讶.
感谢您提供任何信息.
...当许多实例可能共享同一个对象时,它很有用.正确?
不完全是.当许多实例可能拥有相同的对象时,它很有用.共享不足以证明使用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::vector或std::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)
| 归档时间: |
|
| 查看次数: |
855 次 |
| 最近记录: |