这篇文章最初是一个RFC,但是当我写它时,我几乎回答了我自己的问题,现在它或多或少是一个教程。不过,可以将其视为RFC,只是没有问题,因为您可能能够推断出现在非问题的一般要点。
当从大多数ARX api获取新的对象指针时,对象在函数调用中通过引用传递,函数的返回通常是Acad::ErrorStatus。就目前而言,这并不适合非常干净地使用智能指针,并且您最终会得到2个对象,1个用于指针,另一个用于智能指针。
清单 1 是我通常如何处理这个问题,正如你所看到的,有 2 个对象处理同一个迭代器。我必须确保在原始指针传递给智能指针后将其清空,否则在智能指针被销毁后,我可能会使用它。
所以交易是我希望自动处理这个问题,在用不同的方法花了大约一个小时的时间后,我决定列出2和2a。 最重要的是它很简单,并且名称为 AssignToSmartPointer,我一定会只将其与某种智能指针一起使用。
如果由于某种原因智能指针构造函数失败,它将抛出std::bad_alloc,因此只要原始指针是好的并且不抛出std::bad_alloc,那么智能指针就可以安全地被取消引用。
在下面示例的孤立范围内,这是非常简单的东西。但是,在 if 语句 3 或 4 个块级别深处工作时,每一点帮助都会有所帮助。
清单 1
- AcDbLayerTableIterator * pIterator;
- es = pLayerTable->newIterator(pIterator);
- if(es != Acad::eOk)
- return es;
- [color=navy] boost::scoped_ptr pIter(pIterator); // take control of the pointer and set the
- pIterator = NULL; // set the original pointer to 0
- [/color]
清单 2
- AcDbLayerTableIterator * pIterator;
- es = pLayerTable->newIterator(pIterator);
- if(es != Acad::eOk)
- return es;
- [color=navy]
- boost::scoped_ptr pIter(AssignToSmartPointer(pIterator));
- [/color]
清单 2a (AssignToSmartPointer 的模板定义)
- template
- inline T * AssignToSmartPointer(T *& pOriginalPointer)
- {
- T * pPtr = pOriginalPointer;
- pOriginalPointer = NULL;
- return pPtr;
- }
本帖以下内容被隐藏保护;需要你回复后,才能看到! 游客,如果您要查看本帖隐藏内容请 回复 |