2016-07-30 54 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分配给向量元素,则数据仍会以某种方式损坏。 –

相关问题