我创建了一个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。
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帖子