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*
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++ 中几乎不需要它。
推荐阅读
- c - 如何将 exec 输出存储到文件中?
- android - 如果持有人中的物品已移除,如何交换总数?
- python - FileNotFoundError: [Errno 2] 没有这样的文件或目录。Ubuntu
- python - 在 Python 中获取原始电子邮件发件人服务器
- php - PHP Recursive Loop using UASORT on Multidimensional Array
- r - 带有 dplyr 的 filter() 中的 which() 函数
- c# - 类型 X 不能用作泛型类型 Y 中的类型参数 T
- c++ - 重新安装 Arduino 后 WDT 重置原因 4
- python - 在 Django DetailView 中发表评论
- machine-learning - 如何加快添加两个元组的大向量?