首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写全局运算符new来跟踪巨大的内存分配?

重写全局运算符new来跟踪巨大的内存分配?
EN

Stack Overflow用户
提问于 2010-12-07 03:57:37
回答 4查看 2.4K关注 0票数 6

我正在尝试生成一个大型单片应用程序的特殊构建。我试图解决的问题是跟踪难以重现的巨大内存分配(根据OS报告的情况判断为30-80 by )。我认为问题出在std::vector被调整为负的32位整数值。唯一表现出这种行为的平台是Solaris (也许它是唯一能够成功地分配这种连续内存块的平台)。我是否可以用我的类全局替换std:: vector,将所有调用委托给真实的vector,监视可疑的分配(size > 0x7FFFFFFFu)?也许可以有选择地替换接受size_tresize()方法的构造函数?也许甚至劫持了全球运营商new?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-07 04:17:01

为什么不做这样的事情呢?

代码语言:javascript
复制
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中设置断点可以立即发现问题所在。

票数 5
EN

Stack Overflow用户

发布于 2010-12-07 04:05:10

你可以在向量构造的时候给它提供一个自定义的分配器。

首先,您可以将请求的内存大小委托给std::allocator并对其进行防火墙。

票数 2
EN

Stack Overflow用户

发布于 2010-12-07 04:06:57

看看std::vector类在problem平台上的实现。每个实现都以不同的方式处理内存管理(例如,当您添加一个超出向量当前分配大小的对象时,会有一些是当前分配空间的两倍)。如果您的对象足够大,并且/或者有大量条目添加到向量中,则可以尝试在计算机上的可用(连续)内存之外进行分配。如果是这种情况,您将需要查看该向量的自定义分配器。

如果你在一个向量中存储这么多大的项目,你可能想要查看另一个集合(例如std::list),或者尝试存储指针而不是实际的对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4370399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档