关于指针的困惑



我正在编写一些代码,其中我调用了两个函数。

  • function1(SerializedMsg *source, void *target)反序列化source中的信息,并用它填充target

  • function2(std::shared_ptr<Msg> &msg)。我将用function1创建的消息提供给该功能。

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

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++中几乎不需要它。

相关内容

  • 没有找到相关文章

最新更新