【问题标题】:Library function returns raw pointer and I want to use smart pointer库函数返回原始指针,我想使用智能指针
【发布时间】:2010-10-27 07:45:17
【问题描述】:

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

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

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

createNodeIterator 函数返回一个指向 DOMNodeIterator 对象的指针,这是一个原始指针,因此不能像那样转换为 boost::shared_ptr... 我该如何最好地处理这个问题?改用原始指针?

【问题讨论】:

    标签: c++ smart-pointers


    【解决方案1】:

    我猜这个库提供了一种释放那些 raw 指针的方法?

    如果是这样,您可以使用自定义删除器“创建”shared_ptr,指定库提供的“免费功能”。

    例子:

    如果你有这两个功能:

    Foo* createFoo();
    void freeFoo(Foo* foo);
    

    您可以这样创建shared_ptr

    boost::shared_ptr<Foo> foo(createFoo(), freeFoo);
    

    如果不打算释放 raw 指针,您可以改为提供一个“null-deleter”,它在引用计数器达到 0 时不执行任何操作。

    【讨论】:

    • @Tony:你能给我释放原始指针的代码吗?然后我可以向您展示一个示例解决方案。
    • @ereOn:你说你想要实现 DOMNodeIterator::release 函数?
    • @Tony:不知道。只是一个关于如何分配然后释放这样一个原始指针的示例代码。我从未使用过 Xerces。
    • @ereOn 如果不需要清理,为什么还需要智能指针?
    • @ruslik:为了保持一致性。有时,您会设计一个返回智能指针的 API。根据几件事,您可能想要返回一个“拥有的”智能指针或一个“空删除器”。 API 的调用者不必关心释放,并且在任何地方都使用相同的类型。
    【解决方案2】:

    您可以将boost::shared_ptr&lt;DOMNodeIterator&gt; itera = document-&gt;createNodeIterator(rootelement, DOMNodeFilter::SHOW_ALL, NULL, true); 更改为boost::shared_ptr&lt;DOMNodeIterator&gt; itera( document-&gt;createNodeIterator(rootelement, DOMNodeFilter::SHOW_ALL, NULL, true));,它应该可以正常编译。

    【讨论】:

    • 如果库不使用new 分配指针怎么办?然后,shared_ptr 将在预期其他内容时使用 delete,从而导致未定义的行为。
    • 是的,你是对的。我假设由于 OP 想要使用 shared_ptr,其目的是自动 delete 对象。
    • @ereOn, @Naveen:该具体库需要用户代码调用自定义函数来释放内存。
    【解决方案3】:

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

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

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

    【讨论】:

    • 问题(问题中未指定)是具体库需要用户调用自定义函数来释放内存。该要求不适合使用scope_ptr
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    相关资源
    最近更新 更多