ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-07-24 19:08:43  阅读:205  来源: 互联网

标签:c c11 shared-ptr smart-pointers


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

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

我有

std::map<int, shared_ptr<Tile>> Tiledb;

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

Tiledb.clear();

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

感谢您提供任何信息.

解决方法:

…it’s useful when many instances may be sharing the same object. Correct?

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

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

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

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

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

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

通常,您应该更喜欢将资源保存在像std :: vector或std :: map这样的容器中:

std::map<int, Tile> Tiledb;

容器管理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;

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

// only when Tiles need to keep living after the map is destroyed.
std::map<int, std::shared_ptr<Tile>> Tiledb; 

标签:c,c11,shared-ptr,smart-pointers
来源: https://codeday.me/bug/20190724/1525012.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有