visual C++堆碎片分配错误



我有以下问题。我跑了3000圈。每次通过时,我都会在堆上分配一个字节缓冲区:

uint8_t* frameDest;
try { 
frameDest= new uint8_t[numBytes * sizeof(uint8_t)];
memcpy(frameDest, frameSource, _numBytes);
} catch(std::exception &e) {
printf(e.what());
}

因此,所分配的帧充当来自某个frameSource的数据的目的地_numBytes等于921600。

接下来,在同一循环中,frameDest被推入uint8_t*指针的std::vector(_frames_cache)。该向量用作帧缓存,并在每X帧进行清理。使用当前设置,当缓存中有20多个帧时,我会清理向量。清理缓存的方法是:

void  FreeCache()
{
_frameCacheMutex.lock();
try {
int cacheSize = _frames_cache.size();
for (int i = 0; i < cacheSize; ++i) {
uint8_t* frm = _frames_cache.front();
_frames_cache.erase(_frames_cache.begin());
delete [] frm;
}
} catch (std::exception& e) {
printf(e.what());
}
_frameCacheMutex.unlock();
}

问题是:在第一个代码块中的2000多帧之后引发了错误的alloc异常。我和memory博士一起测试了内存泄漏,但没有发现。此外,我在程序的其他部分的分配/解除分配上没有得到错误或异常。我有两个这样的代码实例在两个独立的线程中运行,这意味着在这个程序的整个生命周期中,将处理大约6000个分配/释放,每个分配/释放96万字节。在整个应用程序中,有更多的堆分配正在进行,但频率与本部分不同。我读过现代编译器以一种非常高级的方式处理堆管理,但我仍然怀疑我的问题与内存碎片有关。我使用的是Visual C++2012编译器(C++11),32位,在Windows7 64位操作系统下。

我的问题是:内存管理问题的可能性有多大?我应该编写或使用自定义堆分配管理器吗?如果不是,会是什么?

很难判断这是否是内存碎片问题。但是,您可能需要考虑在开始时为帧分配固定数量的内存作为环形缓冲区,这样在运行时就不会遇到任何碎片(同时也可以节省内存(去)分配的时间)。当然,不确定这是否适用于您的用例。

最新更新