当前位置: 首页 > 知识库问答 >
问题:

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

陶高峻
2023-03-14

我创建了一个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个答案

申奇希
2023-03-14

这只是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帖子

微生自怡
2023-03-14

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);
}
 类似资料:
  • 问题内容: 我试图通过ctypes用Python中定义的回调替换共享库中的现有函数指针。 C中共享库的源代码: Python脚本的来源: 测试它的脚本: 我得到的输出: 因此,似乎在Python(plotxy)中定义的函数是type ,而在C中定义的函数指针是type 。尽管应用了替换in ,但在调用main函数时似乎没有任何效果。 除了阅读https://docs.python.org/3/li

  • C++ 指针 C++ 允许您传递指针给函数,只需要简单地声明函数参数为指针类型即可。 下面的实例中,我们传递一个无符号的 long 型指针给函数,并在函数内改变这个值: #include <iostream> #include <ctime> using namespace std; void getSeconds(unsigned long *par); int main () {

  • 我正在尝试将参数传递给作为参数传递的函数指针。 代码: 我得到了这个错误: 类型"void"的参数与类型"void(*)(wchar_t*,wchar_t*)"的参数不兼容 如何解决此问题以完成我想要实现的目标? 编辑:对不起,不清楚。我实际上试图完成的是将函数注入子进程并传递两个参数(wchar_t*、wchar_t*),以便我可以使用它们。但主函数可以是void或int argc、char**

  • 我正在尝试编写一个类模板,在内部它使用一个函数(BFGS优化的实现,由环境提供),接口如下: 其中< code>fn和< code>gr是类型的函数指针 和 分别是。我的< code>C 类模板如下所示: 这样,它可以由任何具有两个指定成员函数的类进行实例化,例如: 这可能吗?或者也许有更好的方法来做到这一点 - 将两个成员函数分别作为函数指针传递?(如果目标函数和相应的梯度很简单,那么编写两个函

  • 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个 指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是 函数指针。 函数指针的定义形式为: returnType (*pointerName)(param list); returnType

  • 问题内容: 背景:使用cgo从Golang调用C函数。 我想使用具有以下签名的C函数:。它会修改的数据和,这就是为什么它使用指针,它们的原因。的值是的长度;是一个字符串数组;返回值只是一个(布尔)指示符,用于指示是否存在错误。 在golang中,我可以使用来成功传递和修改。通过使用。示例代码如下: 如您所见,C函数当前为,但我想要的是。 这就是说:我真正想要的是在C中启用对字符串数组的修改(例如,