我正在尝试生成一个大型单片应用程序的特殊构建。我试图解决的问题是跟踪难以重现的巨大内存分配(根据OS报告的情况判断为30-80 by )。我认为问题出在std::vector被调整为负的32位整数值。唯一表现出这种行为的平台是Solaris (也许它是唯一能够成功地分配这种连续内存块的平台)。我是否可以用我的类全局替换std:: vector,将所有调用委托给真实的vector,监视可疑的分配(size > 0x7FFFFFFFu)?也许可以有选择地替换接受size_t和resize()方法的构造函数?也许甚至劫持了全球运营商new?
发布于 2010-12-07 04:17:01
为什么不做这样的事情呢?
void *operator new(size_t size)
{
// if (size > MAX_SIZE) ...
return malloc(size);
}
void *operator new [](size_t size)
{
// if (size > MAX_SIZE) ...
return malloc(size);
}在if中设置断点可以立即发现问题所在。
发布于 2010-12-07 04:05:10
你可以在向量构造的时候给它提供一个自定义的分配器。
首先,您可以将请求的内存大小委托给std::allocator并对其进行防火墙。
发布于 2010-12-07 04:06:57
看看std::vector类在problem平台上的实现。每个实现都以不同的方式处理内存管理(例如,当您添加一个超出向量当前分配大小的对象时,会有一些是当前分配空间的两倍)。如果您的对象足够大,并且/或者有大量条目添加到向量中,则可以尝试在计算机上的可用(连续)内存之外进行分配。如果是这种情况,您将需要查看该向量的自定义分配器。
如果你在一个向量中存储这么多大的项目,你可能想要查看另一个集合(例如std::list),或者尝试存储指针而不是实际的对象。
https://stackoverflow.com/questions/4370399
复制相似问题