关于指针的困惑

Confusion about pointers

我正在编写一些调用两个函数的代码。

我相信我的问题与指针有关。我尝试了两种方法:

std::shared_ptr<Msg> msg;

function1(&source, &msg)

function2(msg)

这导致运行时出现错误 -11 (SIGSEGV),我相信是由于试图访问指针的内存地址,尽管我不确定。

std::shared_ptr<Msg> msg;

void *void_ptr;

function1(&source, void_ptr)

msg = * static_cast<std::shared_ptr<Msg>*> (void_ptr);

function2(msg)

这导致错误 -6 (SIGABRT),这是由于 function1 抛出的异常,因为它被传递了一个空指针作为它的第二个参数。

我试过的其他所有东西都拒绝编译,所以我没有在这里包含它,但如果需要的话可以。

提前致谢,请原谅我对指针和 C++ 的一般了解不足 - 如果这有一个非常简单的解决方案,我不会感到惊讶。

当您使用指针时,您需要注意它们指向的位置以及是否有一些有效内存。

采用第一种方法:

std::shared_ptr<Msg> msg;
function1(&source, &msg);

你传入了shared_ptr所以你函数中的void*指向了shared_ptr的内存。不是 shared_ptr 指向的内存。
但我们可以解决这个问题。

std::shared_ptr<Msg> msg;
function1(&source, msg.get());

这将传入 shared_ptr 指向的指针。但这和做这样的事情是一样的。

function1(&source, nullptr);

shared_ptr 未初始化,因此无法指向内存中的有效对象。所以 shared_ptr 将指向 null。

因此,为了使您的函数正常工作,我们需要一些实际内存

Msg msg{};
function1(&source, &msg);

auto msg = std::make_shared<Msg>();
function1(&source, msg.get());

所以在第一种情况下,您在堆栈上创建对象。也许这对也许不是。这取决于用例。
在第二种情况下,我们将默认构造的对象放入 shared_ptr 并让您的函数用数据填充它。
在这两种情况下,我们现在都有一个有效的消息。

但一般来说,您应该考虑修改 API 函数。不要使用 void*,在现代 c++ 中几乎不需要它。