2015-08-28 74 views
1

我有一個用例,我需要每次都傳遞boost :: shared_array。如果緩衝區沒有被完全使用,我想創建一個相同的存儲空間的新指針但其中的日期已經被寫入使用boost :: shared_array

示例代碼點:

boost::shared_array<uint8_t> buffer; 
    boost::shared_array<uint8_t> placeHolder; 
    buffer.reset(new boost::uint8_t[1024 * 1024]); 
    placeHolder = buffer; 
    uint32_t maxSize = 1024 * 1024; 
    uint32_t dataCopied = 0; 
    while(dataCopied < 1024 * 1024) 
    { 
    uint32_t bytesWritten = getData(placeHolder, maxSize); //This call might give any size of data less than boost::shared_array<uint8_t> buffer; 
    placeHolder = boost::shared_array<uint8_t>(buffer.get() + bytesWritten); 
    } 

不幸的是,這是崩潰了我出來任何線索。 任何建議這個概念出了什麼問題?

+0

一個問題是,你在循環內部隱藏了'placeHolder'變量。 –

回答

2

您不能以這種方式使用boost::shared_array。這條線讓一切出問題:

placeHolder = boost::shared_array<uint8_t>(buffer.get() + bytesWritten) 

你創建新的shared_array,嘗試刪除[]的offseted指針,下一個循環之後,使得不確定的行爲。你不應該在這裏使用共享指針,但如果必須(如在回調),有使用別名構造與std::shared_ptr做這件事的方式:

placeHolder = std::shared_ptr<uint8_t>(
        placeHolder, 
        placeHolder.get() + bytesWritten); 

它會保持共享狀態,改變只有指針,數據緩衝區只會被刪除一次。

工作實例http://melpon.org/wandbox/permlink/9WP08ReJAijjCMHR

如果你只是絕對需要使用boost::shared_array你可以使用缺失者,什麼也不做,但是這只是錯了,如果你使用的解決方案,你應該覺得不對勁。不,謝謝:http://melpon.org/wandbox/permlink/BR44arnH60znibAR

+0

函數「getData」原型類型將boost :: shared_array作爲參數。由於這段代碼必須進入一個大項目,我不能改變原型。有沒有其他的? – kiran

+0

@kiran沒有辦法用'boost :: shared_array'來完成它。 – Arpegius

+0

@kiran我給你添加一個解決方案。但只有當getData不保留指針時才能工作。 – Arpegius