关于指针的困惑
Confusion about pointers
我正在编写一些调用两个函数的代码。
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++ 中几乎不需要它。
我正在编写一些调用两个函数的代码。
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++ 中几乎不需要它。