[英]Confusion about pointers
我正在編寫一些調用兩個函數的代碼。
function1(SerializedMsg *source, void *target)
反序列化source
中的信息並用它填充target
。
function2(std::shared_ptr<Msg> &msg)
。 我向這個 function 提供使用function1
創建的消息。
我相信我的問題與指針有關。 我嘗試了兩種方法:
std::shared_ptr<Msg> msg;
function1(&source, &msg)
function2(msg)
這導致在運行時出現錯誤-11(SIGSEGV),我相信是由於試圖訪問指針的 memory 地址,盡管我當然不確定。
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
引發了異常,因為它傳遞了 null 指針作為其第二個參數。
我嘗試過的所有其他內容都拒絕編譯,所以我沒有在此處包含它,但如有必要可以。
在此先感謝,請原諒我對指針和 C++ 的了解不足 - 如果這有一個非常簡單的解決方案,我不會感到驚訝。
當您使用指針時,您需要注意它們指向的位置以及是否有一些有效的 memory。
采取第一種方法:
std::shared_ptr<Msg> msg;
function1(&source, &msg);
您傳入 shared_ptr,因此 function 中的void*
指向 shared_ptr 的 memory。 不是 shared_ptr 指向的 memory。
但我們可以解決這個問題。
std::shared_ptr<Msg> msg;
function1(&source, msg.get());
這將傳入 shared_ptr 指向的指針。 但這與做這樣的事情是一樣的。
function1(&source, nullptr);
shared_ptr 未初始化,因此它不能指向 memory 中的有效 object。 所以 shared_ptr 將指向 null。
所以要讓你的 function 工作,我們需要一些真正的 memory
Msg msg{};
function1(&source, &msg);
auto msg = std::make_shared<Msg>();
function1(&source, msg.get());
因此,在第一種情況下,您在堆棧上創建 object。 也許這對mabe來說沒問題。 這取決於用例。
在第二種情況下,我們將默認構造的 object 放入 shared_ptr 並讓您的 function 用數據填充它。
在這兩種情況下,我們現在都有一個有效的消息。
但一般來說,您應該考慮修改函數的 API。 不要使用void*
,在現代 c++ 中幾乎不需要它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.