c++ - 如何将现有对象的地址分配给智能指针?

标签 c++ smart-pointers c++14 unique-ptr

#include <memory>

class bar{};

void foo(bar &object){
    std::unique_ptr<bar> pointer = &object;
}

我想将对象的地址分配给指针。上面的代码显然不会编译,因为赋值运算符的右侧需要是 std::unique_ptr。我已经试过了:

pointer = std::make_unique<bar>(object)

但是它在编译过程中会抛出很多错误。我该怎么做?

更新
正如答案中所说 - 使用 std::unique_ptr::reset 方法会导致未定义的行为。现在我知道,在这种情况下我应该使用标准指针。

最佳答案

试试 std::unique_ptr::reset

void foo(bar &object){
    std::unique_ptr<bar> pointer;
    pointer.reset(&object);
}

但请注意,不建议这样做,您不应为传递给函数的引用创建 unique_ptr。在函数结束时,当 pointer 被销毁时,它也会尝试销毁 object,并且它在函数调用之外不可用,从而导致访问内存错误。

示例:这将编译,但会出现运行时错误。

struct bar{ int num;};

void foo(bar &object){
    std::unique_ptr<bar> pointer;
    pointer.reset(&object);
}

int main()
{
    bar obj;
    foo(obj);
    obj.num; // obj is not a valid reference any more.
    return 0;
}

另一方面,您可能要考虑使用 shared_ptr这可以帮助您做出决定:unique_ptr or shared_ptr? .

关于c++ - 如何将现有对象的地址分配给智能指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28502067/

相关文章:

c++ - 可视化 C++ 以帮助理解它

c++ - unique_ptr refcount 的替代方案

c++ - 通过unique_ptr或通过值传递对象以及如何实现

c++ - 推断 CRTP 中模板化成员函数的返回类型

c++ - 管道中 lambda 的意外生命周期

c++ - 这是对 unique_ptr 的误用吗?

c++ - 如何用C实现用户模式定时器?

c++ - 将 32 位路径转换为其 WOW64 等价物

c++ - 使用 boost 命令行解析器处理未知命令

c++ - 如何使用模板化构造函数调用 make_shared 或 make_unique