簡體   English   中英

關於指針的困惑

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM