提问者:小点点

如何使用传递到函数中的对象指针用make_shared创建共享指针?


我创建了一个object实例,并获得一个指向该实例的指针,然后传递给一个函数。负责捕获该指针并将其存储在unordered_map中的函数。

我做了几次尝试让它编译,但没有一次奏效。

#include <iostream>
#include <memory>
#include <unordered_map>

struct Foo {
    std::string name;
};

std::unordered_map<std::string, std::shared_ptr<Foo>> zoo;

void bar(Foo *foo) {
    zoo.emplace("zilla", std::move(std::make_shared<Foo>(foo)));
}


int main()
{
    // Normal
    Foo foo;
    foo.name = "Stackoverflow";
    
    // Get Pointer
    Foo *fuzzy = &foo;
    
    bar(fuzzy);

    return 0;
}

在这种情况下,调用make_shared的正确方法应该是什么?

注意,我不想为指针创建shared_ptr,而是为对象本身创建shared_ptr。


共2个答案

匿名用户

bar应采用std::shared_ptr:

void bar(std::shared_ptr<Foo> foo) {
    zoo.emplace("zilla", std::move(foo));
}

int main()
{
    // Normal
    auto foo = std::make_shared<Foo>();
    foo->name = "Stackoverflow";
    
    bar(foo);
}

匿名用户

这只是Jarod的Anwser的变种。shared_ptr可以从原始指针进行隐含转换,因此只需将原始指针传递给函数即可

#include <iostream>
#include <memory>
#include <unordered_map>

struct Foo {
    std::string name;
};

std::unordered_map<std::string, std::shared_ptr<Foo>> zoo;

void bar(Foo *foo) {
    zoo.emplace("zilla", foo);
}


int main()
{
    auto foo = new Foo;
    foo->name = "Stackoverflow";
    
    // zoo will take the ownership of foo   
    bar(foo);

    return 0;
}

代码的问题与shared_ptr完全无关。因为您不是使用new(或make_shared)动态初始化对象,而是使用

Foo foo;

当初始化foo的范围结束时,foo将被破坏,您引用的任何指针都将成为垃圾,您将有一个未定义的行为。

关于动态初始化,我建议使用此stadkoverflow帖子