库函数返回原始指针,我想使用智能指针

时间:2010-10-27 07:45:18

标签: c++ smart-pointers

我遇到这种情况,我使用的库有许多函数可以返回指向对象的原始指针,我现在如何在程序中使用boost智能指针使用这个库并使用智能指针?

库是xerces-C ++,一个例子是获取文档迭代器:

boost::shared_ptr<DOMNodeIterator> itera = document->createNodeIterator(rootelement, DOMNodeFilter::SHOW_ALL, NULL, true);

createNodeIterator函数返回一个指向DOMNodeIterator对象的指针,这是一个原始指针,因此无法像boost::shared_ptr那样进行转换......我最好如何处理有了这个?改为使用原始指针?

3 个答案:

答案 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());