std::vector的最大大小
maximum size of std::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);
}
}
- 这里m_nPacketLen是可变的,但不会超过22个字节
- 该矢量对于2000记录(44*2000)88000字节运行良好,但是当它超出这个范围时,它就崩溃了。我测试了5000条记录,当调用SetEventInfoList时,它在副本构造函数中崩溃了
所以问题是
- 向量能容纳信息的最大容量是多少
- 若vector不支持这么多字节,那个么我应该使用什么STL容器
注意:在我的项目中不允许使用第三方库,请建议使用纯c++解决方案。
您的问题不在于向量的大小(虽然存在实际限制,但您远未达到这些限制)。这很可能是由于您的代码中的一些错误,当您创建更多对象时,这些错误就会暴露出来。
我建议在崩溃时检查堆栈跟踪,也许可以将其添加到您的问题中。另一个好的策略是将代码减少到重现问题所需的绝对最小值,如果这对解决问题没有帮助,那么将生成的代码发布在这里。
vector
中的元素将始终是每个4/8字节,这取决于您是在32位还是64位系统上,因为您存储的是指针。2k记录将导致使用8kb/16kb内存,因此5k将导致16kb/32kb这应该不是问题(嵌入式系统不包括在内)。您的代码中很可能存在错误。
您的std::vector
包含少量(5000)pointers
。这不太可能突破任何界限。
- 集装箱本身没有任何限制
- 不适用
对不起。你的bug在另一个城堡里(我怀疑是在一个名为m_pPacket
的城堡里)。
Mayby尝试使用对象池模式http://sourcemaking.com/design_patterns/object_pool?
相关文章:
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- 连接和压缩标准::vector<std::字符串的最佳方法>
- C++从 std::vector<std::function<中删除 std::function>>
- 如何在构造函数初始值设定项列表中使用 n 个元素初始化 std::vector<std::time_t>
- 如何使用 CUDA 将 std::vector<std::string> 复制到 GPU 设备
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- 将 std::vector<std::unique_ptr<T>> 移动到 std::vector<std::shared_ptr<T>>
- 如何从 boost::container::vector<std::string>::iterator 访问索引和对象?
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- 为什么转置这个 std::vector<std::vector<std::string> > 这么慢?
- 是否有可能在没有复制的情况下传递 std::vector<int> 作为参数来获得 std::vector<std::array<int, 3>>?
- 在 boost::<double>asio::buffer 中使用像 std::vector<std::complex> 这样的参数
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 如何检查 std::vector<std::string> 的元素是否以某个子字符串开头?
- 在 std::vector<std::vector 中重新存储内部向量<TYPE>>
- 将 std::vector<std::string> 转换为 const char* const*
- 不能将结构push_back() 转换为 std::vector<std::shared_ptr<theStruct>> theVector
- SWIG:传递一个 std::vector< std::vector <double> >指向 python 的指针
- 将 std::vector<std::p air<const K, V>*> 转换为 std::vector<std::p air<const K, V>&g