std :: vector的最大大小

时间:2011-06-07 09:00:31

标签: c++ stl

我在代码中使用vector

    std::vector<CEventLogInfo >

    class CEventLogInfo 
    { 
      // date and time
  unsigned short    m_sMonth;
  unsigned short    m_sDay;
  unsigned int  m_nYear;
  unsigned short    m_sHour;
  unsigned short    m_sMin;
  unsigned short    m_sSec;

  unsigned long m_nGatewayMacID;
  unsigned char m_byCommandType;
  unsigned char m_byStatus;
  unsigned char m_byEventName;
  unsigned char m_byDirection;
  unsigned short    m_nPacketLen;
  char*         m_pPacket;
     // ..some method 
 }
 CEventLogInfo::CEventLogInfo(const CEventLogInfo& refMessage)
 {      
m_sMonth        = refMessage.m_sMonth;
m_sDay          = refMessage.m_sDay;
m_nYear         = refMessage.m_nYear;
m_sHour         = refMessage.m_sHour;
m_sMin          = refMessage.m_sMin;
m_sSec          = refMessage.m_sSec;

m_nGatewayMacID = refMessage.m_nGatewayMacID;
m_byCommandType = refMessage.m_byCommandType;
m_byStatus      = refMessage.m_byStatus;
m_byDirection   = refMessage.m_byDirection;
m_byEventName   = refMessage.m_byEventName;
m_nPacketLen    = refMessage.m_nPacketLen;  
if ( m_nPacketLen!=0)
{
    m_pPacket       = new char[m_nPacketLen];
    memcpy(m_pPacket,refMessage.m_pPacket,m_nPacketLen);

}
else
    m_pPacket = NULL;

  }    


 void CEventLoggerBody::SetEventInfoList(EventInfoList& ListEventLog)
 {
EventInfoList::iterator itrEventLogInfo;
for ( itrEventLogInfo = ListEventLog.begin(); itrEventLogInfo != ListEventLog.end();itrEventLogInfo++)
{
    CEventLogInfo* pEventLogInfo = new CEventLogInfo(*itrEventLogInfo);


    m_ListEventLog.push_back(*pEventLogInfo);
}
 }
  1. 这里m_nPacketLen是可变的,但不会超过22个字节。
  2. 此向量适用于2000记录(44 * 2000)88000字节但是 当它超出这个范围时就会崩溃。我测试了5000条记录,当调用SetEventInfoList时它会在复制构造函数中崩溃。
  3. 所以问题是

    1. 它可以在其中保存信息的向量的最大容量是多少。
    2. 如果vector不支持这么多字节,那么我应该使用什么STL容器。
    3. 注意:我的项目中不允许使用第三方库,请为此提出纯c ++解决方案的建议

4 个答案:

答案 0 :(得分:8)

你的问题不是矢量的大小(虽然有实际的限制,但你离他们不远)。这很可能是由于代码中的某些错误在您创建更多对象时会暴露出来。

我建议在崩溃时检查堆栈跟踪,并将其添加到您的问题中。另一个好的策略是将代码减少到重现问题所需的绝对最小值 - 如果这无法帮助您找出问题 - 请在此处发布生成的代码。

答案 1 :(得分:7)

vector中的元素将始终为4/8字节,具体取决于您是在32位还是64位系统上,因为您存储了指针。 2k记录将导致使用8kb / 16kb内存,因此5k将导致16kb / 32kb这应该不是一个问题(嵌入式系统不计算)。您的代码中很可能存在某个错误。

答案 2 :(得分:1)

您的std::vector包含pointers的小数字(5000)。这不太可能推动任何界限。

  1. 容器本身没有限制。
  2. N / A
  3. 对不起。你的错误发生在另一座城堡里(我怀疑是标有m_pPacket的城堡)。

答案 3 :(得分:1)

Mawby尝试使用对象池模式http://sourcemaking.com/design_patterns/object_pool