我遇到这样的情况,我使用的库有很多函数返回对象的原始指针,我现在如何在使用这个库和使用智能指针的程序中使用boost智能指针?
该库是xerces-C++,其中一个示例是获取文档迭代器:
boost::shared_ptr<DOMNodeIterator> itera = document->createNodeIterator(rootelement, DOMNodeFilter::SHOW_ALL, NULL, true);
createNodeIterator
函数返回一个指向DOMNodeIterator
对象的指针,这是一个原始指针,因此不能像这样强制转换为boost::shared_ptr
...我该如何处理这件事呢?是否使用原始指针?
发布于 2010-10-27 15:49:13
我猜这个库提供了一种释放原始指针的方法?
如果是这样的话,您可以只“创建”一个带有自定义deleter的shared_ptr
,指定由该库提供的“自由函数”。
示例:
如果您有这两个函数:
Foo* createFoo();
void freeFoo(Foo* foo);
您可以通过以下方式创建shared_ptr
:
boost::shared_ptr<Foo> foo(createFoo(), freeFoo);
如果不打算释放原始指针,则可以提供一个"null-deleter“,该指针在引用计数器达到0时不执行任何操作。
发布于 2010-10-27 15:49:36
您可以将boost::shared_ptr<DOMNodeIterator> itera = document->createNodeIterator(rootelement, DOMNodeFilter::SHOW_ALL, NULL, true);
更改为boost::shared_ptr<DOMNodeIterator> itera( document->createNodeIterator(rootelement, DOMNodeFilter::SHOW_ALL, NULL, true));
,它应该可以很好地编译。
发布于 2010-10-27 16:03:07
如果您在本地创建对象,请使用boost::scoped_ptr而不是boost:shared_ptr,因为如果您将其作为参数传递给其他函数,这是非常危险的。如果您正在处理shared_ptr,则还必须考虑对象引用计数。
如果使用Scoped_ptr,它会在对象的作用域结束时自动删除。
类Foo boost::scoped_ptr objfoo(new Foo());
https://stackoverflow.com/questions/4030955
复制相似问题