c++ - 如何安全地填充 Boosts 的指针容器?

标签 c++ boost memory-leaks smart-pointers boost-ptr-container

Boost Pointer Container 的第一个例子添加一个原始指针到结构:

class zoo
{
    boost::ptr_vector<animal> the_animals;
public:

    void add_animal( animal* a )
    {
        the_animals.push_back( a );
    }
};

但是,如果 push_back 或任何其他可能触发重新分配的成员函数在此过程中抛出异常怎么办?根据我的理解,在那种情况下,由调用者来管理给定对象的内存,但是因为调用者将原始指针传递给一个目的是管理内存的类,所以调用者很可能不会'

那么,在将指针提供给容器之前,是否需要在上面的代码示例中使用某种独特的智能指针来包装指针,并绝对确保没有内存泄漏?容器确实为此类智能指针提供了重载,但它们并不强制使用它们。

或者说容器在任何添加操作期间都不会抛出异常并且总是成功的论点?

最佳答案

如果您使用的是 std::vector<animal*> 而不是 boost::ptr_vector<animal> ,那么您的担忧是非常有效的。 Boost.PointerContainer 旨在处理指向需要释放的资源的指针,因此它使您不必担心此类事情。

Boost 文档为各种成员函数提供异常安全保证。 ptr_vector push_back 继承 ptr_sequence_adaptor ,并将 push_back 的行为列为

void push_back( T* x );

Requirements: x != 0
Effects: Inserts the pointer into container and takes ownership of it
Throws: bad_pointer if x == 0
Exception safety: Strong guarantee

strong guarantee 意味着如果 push_back 抛出,容器的状态将回滚到调用 push_back 之前的状态,并且不会泄漏任何资源。现在,您可能会争辩说,这并不能保证您尝试添加到容器中的资源的任何内容,但是对于实现而言,允许该资源泄漏将是非常糟糕的形式,尤其是在调用 push_back 之后应该取得调用者传递的对象的所有权。

如果我们查看 push_backimplementation,它会显示 ptr_vector 如何保证您尝试添加的资源不会泄漏。

void push_back(value_type x)  // strong               
{
    this->enforce_null_policy(x, "Null pointer in 'push_back()'");

    auto_type ptr(x);           // notrow
    this->base().push_back(x);  // strong, commit
    ptr.release();                // nothrow
}

因此,在尝试实际的 auto_type 操作之前首先构建 push_back。进一步挖掘发现 auto_type static_move_ptr 的别名,这是一种智能指针类型,必要时会在销毁时释放它拥有的资源。

因此,在所示示例中,您尝试添加的 animal * 永远不会被泄露,即使抛出异常也是如此。

关于c++ - 如何安全地填充 Boosts 的指针容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30379411/

相关文章:

c++ - boost::spirit::qi 和 boost::phoenix::push_back

c++ - 如何使第三方库线程安全以用于 Boost 线程?

c++ - Qt,关于UDPlink的线程安全

c++ - "const class"是什么意思?

c++ - 将 ptime 转换为 std::string

c++ - 创建了我自己的字符串类——重载赋值运算符和析构函数的错误

c++ - 如何从 C 的 "getcwd"函数返回一个 std::string

c++ - 为什么迭代对象列表比迭代对象指针列表慢?

c++ - 如何获取 C++ 中抽象(?)pimpl 的调试信息?

android - 这段代码可以避免 Android 处理程序内存泄漏吗?