首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >库函数返回原始指针,而我想使用智能指针

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

Stack Overflow用户
提问于 2010-10-27 15:45:18
回答 3查看 982关注 0票数 3

我遇到这样的情况,我使用的库有很多函数返回对象的原始指针,我现在如何在使用这个库和使用智能指针的程序中使用boost智能指针?

该库是xerces-C++,其中一个示例是获取文档迭代器:

代码语言:javascript
运行
复制
boost::shared_ptr<DOMNodeIterator> itera = document->createNodeIterator(rootelement, DOMNodeFilter::SHOW_ALL, NULL, true);

createNodeIterator函数返回一个指向DOMNodeIterator对象的指针,这是一个原始指针,因此不能像这样强制转换为boost::shared_ptr...我该如何处理这件事呢?是否使用原始指针?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-27 15:49:13

我猜这个库提供了一种释放原始指针的方法?

如果是这样的话,您可以只“创建”一个带有自定义deleter的shared_ptr,指定由该库提供的“自由函数”。

示例:

如果您有这两个函数:

代码语言:javascript
运行
复制
Foo* createFoo();
void freeFoo(Foo* foo);

您可以通过以下方式创建shared_ptr

代码语言:javascript
运行
复制
boost::shared_ptr<Foo> foo(createFoo(), freeFoo);

如果不打算释放原始指针,则可以提供一个"null-deleter“,该指针在引用计数器达到0时不执行任何操作。

票数 6
EN

Stack Overflow用户

发布于 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));,它应该可以很好地编译。

票数 0
EN

Stack Overflow用户

发布于 2010-10-27 16:03:07

如果您在本地创建对象,请使用boost::scoped_ptr而不是boost:shared_ptr,因为如果您将其作为参数传递给其他函数,这是非常危险的。如果您正在处理shared_ptr,则还必须考虑对象引用计数。

如果使用Scoped_ptr,它会在对象的作用域结束时自动删除。

类Foo boost::scoped_ptr objfoo(new Foo());

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4030955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档