我正在编写一些代码,其中我调用了两个函数。
-
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++中几乎不需要它。