首页 > 解决方案 > 关于指针的困惑

问题描述

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

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

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++ 的一般知识 - 如果这有一个非常简单的解决方案,我不会感到惊讶。

标签: c++pointersmemorysegmentation-faultnull-pointer

解决方案


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

采取第一种方法:

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

您传入 shared_ptr,因此void*in you 函数指向 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());

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

但总的来说,您应该考虑重新设计函数的 API。不要使用void*,在现代 c++ 中几乎不需要它。


推荐阅读