visual C++堆碎片分配错误
visual C++ bad allocation from heap fragmentation?
我有以下问题。我跑了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位操作系统下。
我的问题是:内存管理问题的可能性有多大?我应该编写或使用自定义堆分配管理器吗?如果不是,会是什么?
很难判断这是否是内存碎片问题。但是,您可能需要考虑在开始时为帧分配固定数量的内存作为环形缓冲区,这样在运行时就不会遇到任何碎片(同时也可以节省内存(去)分配的时间)。当然,不确定这是否适用于您的用例。
相关文章:
- vector.resize()中的分配错误
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 如何处理以下代码中的内存分配错误
- 动态内存分配错误
- C++向量上的分配错误
- libtorrent file_storage无效:分配错误
- 数组大小分配错误
- 只读位置'__result.std::_Rb_tree_const_iterator<_Tp>::operator*<long long int>()'分配错误
- C++ 内存分配错误?
- 具有特征成员变量分类和分配错误的C 类
- 为什么这种递归子集和算法会导致指针分配错误
- CSTRING分配错误
- 运行时间内存分配错误
- 以下C++代码给出了一些内存分配错误
- 尝试在c++中创建USRP对象时分配错误
- 多阵列动态内存分配错误
- C++:矢量分配错误
- 通过结构指针访问结构变量分配错误数据
- 声明向量时出现神秘的 malloc 内存分配错误