2016-07-30 51 views
0

我有一個靈活的數組成員,我需要使用一個結構。是否有可能有一個std ::向量的結構與fexible數組成員?

struct Record 
{ 
    uint32_t length; 
    Data contents[]; 
}; 

我能夠初始化這個和做這樣使用它:(它也將使用malloc或任何其他動態分配工作)

vector<Data> members; 
vector<uint8_t> buffer; 
Record myRecord; 
buffer.resize(sizeof(Record) + members.size() * sizeof(Data)); 
myRecord = *(reinterpret_cast<Record*>(buffer.data()); 
myRecord.length = static_cast<uint32_t>(members.size()); 
// copy members to myRecord.contents 

這工作得很好。但是現在我需要一個可以批量處理Record的接口,並且我一直在試圖使用std :: vector來實現這一點。然後問題開始出現,我猜測這是因爲std :: vector在內存中連續排列所有元素,並且由於sizeof(Record)不會考慮內容的大小(每個向量元素只能保存4個字節,而不是4個字節+ size_of_contents * sizeof(Data)),矢量元素實際上是共享內存,然後每個元素開始覆蓋前一個元素的內容。那有意義嗎?

如果這真的是問題,我想知道是否有任何方法來「強制」向量爲每個元素分配一個特定的大小(而不是爲元素的類型返回任何sizeof)。這樣我可以確保每個向量元素都有足夠的大小。如果這是不可能的,是否有其他解決方案?也許是一個不同的容器,可以讓我這樣做?請記住,我做,因爲它的定義需要使用結構(我很想只需更換整個事情的載體,但不幸的是這是不可能的)

+1

您沒有提到*開始出現的問題* – rgoliveira

+1

請參閱tag-wiki(http://stackoverflow.com/tags/flexible-array-member/info):該功能是C99 +的一部分,而不是C++。另外,請避免將C++問題混淆爲C語言問題。現在,一些gnu ++方言可能會結合這些... – Deduplicator

+0

@rgoliveira我的意思是說數據開始變得不一致。 –

回答

2

你的原則問題是這樣的:

myRecord = *(reinterpret_cast<Record*>(buffer.data()); 

這只是覆蓋堆棧變量中的數據。這並不改變myRecord的地址突然指向buffer.data()。這意味着當你以後做myRecord.contents[...] = ...時,你會摧毀堆棧。

什麼你幾乎可以肯定打算是:

Record *myRecord = (reinterpret_cast<Record*>(buffer.data()); 

那麼你將有一個指針內存buffer管理,這將有對myRecord->contents陣列足夠的存儲空間。

不能對待Record像一個值類型。就C++的對象模型而言,它不是一種值類型。它不能像大多數C++類型那樣被複制或移動。您只能通過指向您在此處使用的特定分配的指針/引用來操作它。

這就是說,使用vector來管理你的Record*這樣的存儲真的很奇怪。使用unique_ptr會更好,因爲調整分配大小是一個非常糟糕的主意。

std::unique_ptr<char[]> storage = new char[sizeof(Record) + (members.size() * sizeof(Data))]; 

這也可以防止系統初始化內存,因爲無論如何你會覆蓋它。

我想知道是否有任何方法來「強制」向量爲每個元素分配一個特定的大小(而不是爲元素的類型返回任何sizeof)。

No.vector管理相同類型的元素的連續數組。在C++中,相同類型的所有對象都具有相同的大小。

+0

正如OP不能在堆棧上記錄一樣,向量只需要是一個(智能)指針矢量 – Yakk

+0

@Yakk:我得到的印象是「vector 」實際上是數據的來源在他的申請中。但是當他需要與C代碼交談時,他需要將其轉換爲靈活的陣列成員。所以他不需要長期存儲「Record」對象。至少,這是我從問題中得到的意義。 –

+0

@NicolBolas謝謝。但是在嘗試添加到矢量時遇到同樣的問題。如果我按照您的建議通過* myRecord管理存儲,然後嘗試push_back(* myRecord)或將* myRecord分配給向量元素,則數據仍會以某種方式損壞。 –

相關問題