【问题标题】:Can i pass auto_ptr by reference to functions?我可以通过引用函数来传递 auto_ptr 吗?
【发布时间】:2010-03-21 09:57:48
【问题描述】:

下面的函数是否OK:

void DoSomething(auto_ptr< … >& a)....

【问题讨论】:

    标签: c++ smart-pointers auto-ptr


    【解决方案1】:

    你可以这样做,但我不确定你为什么要这样做。

    如果您使用 auto_ptr 来指示 ptr 的所有权(正如人们通常所做的那样),那么如果您想将 ptr 的所有权转移给函数,则只需将 auto_ptr 传递给函数,在这种情况下您将通过值传递 auto_ptr:

    void DoSomething(auto_ptr<int> a)
    

    所以任何调用 DoSomething 的代码都会放弃 ptr 的所有权:

    auto_ptr<int> p (new int (7));
    DoSomething (p);
    // p is now empty.
    

    否则只通过值传递ptr:

    void DoSomething(int* a)
    {...}
    
    ...
    
    auto_ptr<int> p (new int (7));
    DoSomething (p.get ());
    // p still holds the ptr.
    

    或将 ref 传递给指向的对象:

    void DoSomething(int& a)
    {...}
    
    ...
    
    auto_ptr<int> p (new int (7));
    DoSomething (*p);
    // p still holds the ptr.
    

    第二个通常更可取,因为它更明确地表明 DoSomething 不太可能尝试删除对象。

    【讨论】:

    • 按值传递指针是不安全的 - 可能会发生内存泄漏。创建没有“新”的对象意味着该对象将在堆栈​​上 - 也不确定这是最好的方法。
    • @eriks:内存泄漏可以在很多情况下发生;即使您通过引用传递auto_ptr,也有人可以调用delete ptr.get(),这会更糟。按值传递指针不会传递有关所有权转移或正确删除形式的信息,因此 - 在没有相反的文档的情况下 - 我不希望被调用者删除指向的对象。
    • @eriks:你不会得到内存泄漏,你只会得到悬空指针。
    • @eriks:我已经扩展了我的示例以希望澄清。
    猜你喜欢
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2020-09-08
    • 2012-02-10
    • 1970-01-01
    • 2015-09-15
    • 2014-08-22
    相关资源
    最近更新 更多