jgr*_*owl 6 c++ boost smart-pointers vector
只是一个我一直在遇到的概念性问题.在我目前的项目中,我觉得我过度使用了boost smart_ptr和ptr_container库.我boost::ptr_vectors
在许多不同的对象中创建并调用transfer()方法将某些指针从一个移动boost::ptr_vector到另一个.
我的理解是,清楚地显示堆分配对象的所有权非常重要.
我的问题是,是否需要使用这些boost库来创建属于对象的堆分配成员,然后get()在进行任何处理时使用通常指向这些成员的指针.
例如......游戏可能有一组属于它的Tiles.创建这些瓷砖可能是有意义的boost::ptr_vector.当游戏结束时,应自动释放这些图块.
但是,如果我想暂时将这些Tiles放在Bag对象中,我是否应该boost::ptr_vector在包中创建另一个Tile并将游戏的Tiles转移到Bag上,transfer()或者我应该创建一个std::vector<Tile*>Tiles*引用游戏中的Tiles并传递给去袋子?
谢谢.
**编辑我应该指出,在我的例子中,Game会有一个Bag对象作为成员.袋子只会填充游戏所拥有的瓷砖.所以如果没有游戏,Bag就不会存在.
Pav*_*aev 15
您应该只使用拥有明智的所有权转移的智能指针和指针容器.对象是否是临时的并不重要 - 重要的是它是否拥有所有权(因此,前任所有者是否放弃所有权).
如果你创建一个临时的指针向量只是为了将它传递给其他函数,并且原始ptr_vector仍然引用所有这些对象,那么就没有所有权转移,因此你应该使用plain vector作为临时对象 - 就像你使用raw一样用于将单个对象传递给ptr_vector带有指针的函数的指针,但不会将其存储在任何位置.
根据我的经验,出现了三种主要的所有权模式.我将它们称为树,DAG和图形.
最常见的是一棵树.父母拥有其子女,而子女又拥有子女等等.你通常在这里看到auto_ptr,scoped_ptr,裸指针和boost ptr_x类.在我看来,通常应该避免使用裸指针,因为它们根本不传达所有权语义.
第二个最常见的是DAG.这意味着您可以拥有共享所有权.父母拥有的子女也可能是父母拥有的其他子女的子女.TR1和boost shared_ptr模板是这里的主要角色.没有周期时,参考计数是一种可行的策略.
第三个最常见的是完整的图表.这意味着您可以拥有周期.有一些策略可以破坏这些周期并以一些可能的错误来源为代价返回DAG.这些通常由TR1或boost的weak_ptr模板表示.
使用weak_ptr无法分解为DAG的完整图形是一个在C++中无法轻易解决的问题.唯一好的处理程序是垃圾收集方案.它们也是最通用的,能够很好地处理其他两个方案.但他们的普遍性是有代价的.
在我看来,你不能过度使用ptr_x容器类或auto_ptr,除非你真的应该使用对象容器而不是指针容器.shared_ptr可能被滥用.仔细考虑您是否真的需要DAG.
当然我认为人们应该只使用scope_ptrs的容器而不是boost ptr_x类,但那将不得不等待C++ 0x.:-(
您最有可能寻找的解决方案是
std::vector<Tile>
Run Code Online (Sandbox Code Playgroud)
大多数时候都不需要指针。向量已经处理了包含对象的内存管理。方块归游戏所有,不是吗?明确表示的方法是将对象本身放在游戏类中-唯一通常需要指针并动态分配单个对象的情况是,如果需要1)多态,或2)共享所有权。
但是指针应该是例外,而不是规则。
| 归档时间: |
|
| 查看次数: |
8755 次 |
| 最近记录: |