gpt4 book ai didi

C++ 堆碎片分配错误?

转载 作者:太空狗 更新时间:2023-10-29 23:17:00 24 4
gpt4 key购买 nike

我有以下问题。我运行了一个循环 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 被插入 std::vector of uint8_t* pointers(_frames_cache)。这个 vector 用作帧缓存,每 X 帧被清理一次。使用当前设置,我在超过 20 个时清理 vector 帧在缓存中。清理缓存的方法是这样的:

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+ 帧后抛出错误的分配异常。我用 Dr.Memory 测试了内存泄漏,但没有发现。此外,我在其他部分的分配/解除分配上也没有发现任何错误或异常程序。我有 2 个这样的代码实例在 2 个单独的线程中运行,这意味着在这个程序的整个生命周期中,处理了大约 6000 个分配/释放,每个 960000 字节。在整个应用程序中,有更多的堆分配正在进行但是不像这部分那样频繁。我读过现代编译器以非常先进的方式处理堆管理,但我仍然怀疑我的问题与内存碎片有关。我使用 Visual C++ 2012 编译器(C++ 11),32 位在 Windows7 64 位操作系统下。

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

最佳答案

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

关于C++ 堆碎片分配错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20949306/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com