std::vector的最大大小

maximum size of std::vector

本文关键字:vector std      更新时间:2023-10-16

我在代码中使用矢量

    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时,它在副本构造函数中崩溃了

所以问题是

  1. 向量能容纳信息的最大容量是多少
  2. 若vector不支持这么多字节,那个么我应该使用什么STL容器

注意:在我的项目中不允许使用第三方库,请建议使用纯c++解决方案

您的问题不在于向量的大小(虽然存在实际限制,但您远未达到这些限制)。这很可能是由于您的代码中的一些错误,当您创建更多对象时,这些错误就会暴露出来。

我建议在崩溃时检查堆栈跟踪,也许可以将其添加到您的问题中。另一个好的策略是将代码减少到重现问题所需的绝对最小值,如果这对解决问题没有帮助,那么将生成的代码发布在这里。

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

您的std::vector包含少量(5000)pointers。这不太可能突破任何界限。

  1. 集装箱本身没有任何限制
  2. 不适用

对不起。你的bug在另一个城堡里(我怀疑是在一个名为m_pPacket的城堡里)。

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

相关文章: