максимальный размер std :: vector - PullRequest
1 голос
/ 07 июня 2011

Я использую вектор в своем коде

    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 ++ для этого .

Ответы [ 4 ]

8 голосов
/ 07 июня 2011

Ваша проблема не в размере вектора (хотя есть практические ограничения, вы их совсем не рядом).Скорее всего, это связано с некоторой ошибкой в ​​вашем коде, которая появляется, когда вы создаете больше объектов.

Я бы порекомендовал изучить трассировку стека в момент сбоя и, возможно, добавить ее к вашему вопросу.Другая хорошая стратегия - сократить ваш код до абсолютного минимума, необходимого для воспроизведения проблемы, и - если это не поможет вам разобраться в проблеме - опубликуйте полученный код здесь.

7 голосов
/ 07 июня 2011

Ваши элементы в vector всегда будут иметь размер 4/8 байт каждый, в зависимости от того, используете ли вы 32-битную или 64-битную систему, потому что вы храните указатели . Запись 2 КБ приведет к использованию памяти 8 КБ / 16 КБ, поэтому 5 КБ приведут к 16 КБ / 32 КБ. Это не должно быть проблемой (встроенные системы не учитываются). Скорее всего, где-то в вашем коде есть ошибка.

1 голос
/ 07 июня 2011

Может попытаться использовать объектный пул патерн http://sourcemaking.com/design_patterns/object_pool?

1 голос
/ 07 июня 2011

Ваш std::vector содержит небольшое число (5000) из pointers.Это очень маловероятно, чтобы раздвинуть какие-либо границы.

  1. Нет ограничений, налагаемых самим контейнером.
  2. n / a.

Извините.Ваша ошибка находится в другом замке (я подозреваю, что в одном помечены m_pPacket).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...