gpt4 book ai didi

c++ - 执行 memcpy 时内存泄漏

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:42 25 4
gpt4 key购买 nike

我正在尝试编写一个处理 ffmpeg 的实用程序。一旦我需要将图像平面从一个指针复制到另一个指针。从 AVPicture 结构到我自己的。这是一些来源。

我自己的框架结构。内存在构造函数中分配,在析构函数中释放

template <class DataType>
struct Frame
{
DataType* data; //!< Pointer to image data
int f_type; //!< Type of color space (ex. RGB, HSV, YUV)
int timestamp; //!< Like ID of frame. Time of this frame in the video file
int height; //!< Height of frame
int width; //!< Width of frame

Frame(int _height, int _width, int _f_type=0):
height(_height),width(_width),f_type(_f_type)
{
data = new DataType[_width*_height*3];
}

~Frame()
{
delete[] data;
}
};

这是执行转换的主循环。如果带有 memcpy 的行被注释,则根本没有内存泄漏。但如果我取消注释,就会出现内存泄漏。

for(int i = begin; i < end; i++)
{
AVPicture pict;
avpicture_alloc(&pict, PIX_FMT_BGR24, _width, _height);
std::shared_ptr<Frame<char>> frame(new Frame<char>(_height, _width, (int)PIX_FMT_BGR24));

sws_scale(ctx, frame_list[i]->data, frame_list[i]->linesize, 0, frame_list[i]->height, pict.data, pict.linesize);

memcpy(frame->data,pict.data[0],_width*_height*3);

//temp_to_add->push_back(std::shared_ptr<Frame<char>>(frame));

avpicture_free(&pict);
}

我一直在尝试很多事情,例如:通过 malloc 分配内存并通过 free 解除分配,手动将内存从 pic 复制到 frame(在 for 循环中),使用 std::copy 和 avpicture_layout 这是 ffmpeg 辅助函数。没有任何帮助。所以问题是:我是否忘记了一些重要的事情?

我将不胜感激每一个答案。

最佳答案

您确定这是泄漏,而不仅仅是您在内存中出错的事实吗?

如果您调用malloc()new,该语言将允许您访问内存。然而,操作系统(在 Windows、Linux 或 MacOS X 等虚拟内存操作系统的情况下)实际上不会使页面成为任务工作集的一部分,直到您尝试使用该内存执行某些操作。

如果您认为您的泄漏是因为 memcpy() 导致 Windows 进程资源管理器中的进程大小增加,那么这是一个糟糕的结论。即使您 free()delete 对象,进程大小也不一定会减少。

以这两个测试用例为例。两者显然都是零泄漏。

// test 1
int main()
{
volatile int *data = (volatile int *)malloc( (1 << 24) * sizeof(int) );
free((void *)data);

// Spin until killed, so we're visible in the process explorer as long as needed
while (1)
;
}

// test 2
int main()
{
volatile int *data = (volatile int *)malloc( (1 << 24) * sizeof(int) );
int i;

for (i = 0; i < (1 << 24); i++)
data[i] = i;

free((void *)data);

// Spin until killed, so we're visible in the process explorer as long as needed
while (1)
;
}

我怀疑第二个会在进程资源管理器中显示更大的内存占用空间。它应该超过 64MB。

这两个程序的不同之处在于,第二个程序实际上写入了它分配的内存,因此强制操作系统实际使页面可供任务使用。一旦任务拥有这些页面,它通常不会将它们还给操作系统。

(如果在上面的示例中确实发生了这种情况,请尝试使用更小的大小,例如 (1 << 18) 或类似的东西。有时 malloc 在这里确实很聪明,但通常情况下不会。)

关于c++ - 执行 memcpy 时内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19615925/

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