我遇到这种情况,我使用的库有许多函数可以返回指向对象的原始指针,我现在如何在程序中使用boost智能指针使用这个库并使用智能指针?
库是xerces-C ++,一个例子是获取文档迭代器:
boost::shared_ptr<DOMNodeIterator> itera = document->createNodeIterator(rootelement, DOMNodeFilter::SHOW_ALL, NULL, true);
createNodeIterator
函数返回一个指向DOMNodeIterator
对象的指针,这是一个原始指针,因此无法像boost::shared_ptr
那样进行转换......我最好如何处理有了这个?改为使用原始指针?
答案 0 :(得分:6)
我想这个库提供了一种释放那些原始指针的方法吗?
如果是这样,您只需使用自定义删除器“创建”shared_ptr
,指定库提供的“自由功能”。
示例:
如果你有两个功能:
Foo* createFoo();
void freeFoo(Foo* foo);
您可以通过以下方式创建shared_ptr
:
boost::shared_ptr<Foo> foo(createFoo(), freeFoo);
如果不打算释放 raw 指针,则可以提供“null-deleter”,当引用计数器达到0时,它不执行任何操作。
答案 1 :(得分:0)
您可以将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));
,它应该可以正常编译。
答案 2 :(得分:0)
如果要在本地创建对象,请使用boost :: scoped_ptr而不是boost:shared_ptr,因为如果将参数作为参数传递给其他函数,则非常危险。如果您正在处理shared_ptr,那么您也可以考虑对象引用计数。
如果使用Scoped_ptr,它会在对象范围结束时自动删除。
Class Foo boost :: scoped_ptr objfoo(new Foo());