簡體   English   中英

如何將 boost::array 轉換為 boost::shared_ptr

[英]how can i convert boost::array to boost::shared_ptr

boost::array<uint8_t,1000> buffer;
ByteBuffer b((boost::shared_ptr<uint8_t>)buffer.data(), buffer.size());

好吧,演員有點工作,但是當調試器 go 到方法結束時,它給了我一個錯誤,所以我想知道是否有其他方法可以轉換/轉換它以使其工作!

這是沒有意義的。 您正試圖通過應用任意強制轉換來“破解”錯誤。

shared_ptr是指向動態分配對象的指針的包裝器。 它管理它們的動態生命周期。

array是具有自動存儲持續時間的數組的包裝器。 它包裝的uint8_t數組不是 memory 的動態分配塊。

因此,這種轉換是完全不合適的,並且會導致未定義的行為......即使您可以編譯它也是如此。 通常,使用 C++ 類型轉換,如static_cast ,它會以 C 類型轉換不會出現的錯誤轉換方式出錯。

(使用 C 強制轉換以使其“正常工作”是很誘人的,但實際上您通常做的是將頭埋在沙子中並在您的代碼崩潰成廢話時唱“啊哈”。)

為什么不只是:

ByteBuffer b(buffer.data(), buffer.size());

如果ByteBuffer確實需要一個shared_ptr作為輸入,那么您將不得不將數據存儲在一個由shared_ptr控制的 memory動態塊中,或者將其復制到一個中以進行此操作。

我不確定您要做什么。 如果要創建一個 1000 uint8_t 的引用計數塊,則創建一個共享數組:

boost::shared_array<uint8_t>(new uint8_t[1000])

進行這項工作的唯一方法是以下。 我認為這是一個非常糟糕的主意:

boost::array<uint8_t,1000> buffer;
ByteBuffer b(boost::shared_ptr<uint8_t>(buffer.data(), [](uint8_t*){}), buffer.size()); // Note that the deleter does nothing.

什么是字節緩沖區? 那是來自其他地方的標准庫 class、class,還是您自己編寫的? 聲明是什么,它在實例化時期望什么類型?

在我看來,這聽起來像是一個 class 用於管理一大塊原始 memory - 但 boost:array 或 shared_array 已經這樣做了。 你真正想要達到什么目的?

我認為要么:

  • ByteBuffer 需要一個指向現有 memory 的原始指針 (char*),而您錯誤地使用了 shared_ptr(shared_ptr 僅適用於由“new”分配的單個 object)
  • 或者,您根本不需要 ByteBuffer,您需要的一切都可以通過 boost::array 來完成
  • 或者,ByteBuffer 需要一個 shared_ptr 到某種類型的 object 而不是數組
  • 或者,ByteBuffer 確實需要一個 shared_ptr 到一個數組,但這幾乎可以肯定是壞的。 可以這樣做,但是(a)強制轉換不這樣做,只是說“這個 memory,將其解釋為另一種 object,即使這只是將垃圾數據放入”(除非這兩種類型有一個內置轉換,數組和 shared_ptr 沒有)和(b)它很奇怪而且很繁瑣,老實說,我一秒鍾都不相信 ByetBuffer 期望這樣做,或者如果確實如此,那么它值得使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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