我正在尝试查找并修复我的应用程序中存在的内存泄漏。我正在试用的内存分析工具 - C++ Memory Validator - 显示大约每 5 分钟分配 1,310,706 个字节。这些分配的调用堆栈可以追溯到我认为是用 pascal 编写的 Embarcadero 内存管理器。有问题的功能是:
{Allocates a new sequential feed medium block pool and immediately splits off a
block of the requested size. The block size must be a multiple of 16 and
medium blocks must be locked.}
function AllocNewSequentialFeedMediumPool(AFirstBlockSize: Cardinal): Pointer;
var
LOldFirstMediumBlockPool: PMediumBlockPoolHeader;
LNewPool: Pointer;
begin
{Bin the current sequential feed remainder}
BinMediumSequentialFeedRemainder;
{Allocate a new sequential feed block pool}
LNewPool := VirtualAlloc(nil, MediumBlockPoolSize, MEM_COMMIT, PAGE_READWRITE);
if LNewPool <> nil then
begin
{Insert this block pool into the list of block pools}
LOldFirstMediumBlockPool := MediumBlockPoolsCircularList.NextMediumBlockPoolHeader;
PMediumBlockPoolHeader(LNewPool).PreviousMediumBlockPoolHeader := @MediumBlockPoolsCircularList;
MediumBlockPoolsCircularList.NextMediumBlockPoolHeader := LNewPool;
PMediumBlockPoolHeader(LNewPool).NextMediumBlockPoolHeader := LOldFirstMediumBlockPool;
LOldFirstMediumBlockPool.PreviousMediumBlockPoolHeader := LNewPool;
{Store the sequential feed pool trailer}
PNativeUInt(PByte(LNewPool) + MediumBlockPoolSize - BlockHeaderSize)^ := IsMediumBlockFlag;
{Get the number of bytes still available}
MediumSequentialFeedBytesLeft := (MediumBlockPoolSize - MediumBlockPoolHeaderSize) - AFirstBlockSize;
{Get the result}
Result := Pointer(PByte(LNewPool) + MediumBlockPoolSize - AFirstBlockSize);
LastSequentiallyFedMediumBlock := Result;
{Store the block header}
PNativeUInt(PByte(Result) - BlockHeaderSize)^ := AFirstBlockSize or IsMediumBlockFlag;
end
else
begin
{Out of memory}
MediumSequentialFeedBytesLeft := 0;
Result := nil;
end;
end;
请注意,变量 MediumBlockPoolSize 是一个常量,它是泄漏的确切大小。
我认为正在发生的事情是,当我的应用程序泄漏内存时,它会分配一些东西,此时我们从可用内存池中请求一个新的内存块(1.3MB),我认为这大约会发生5 分钟。但是,这并不能准确地告诉我泄漏的来源。有什么方法可以更好地查明泄漏源吗?
我已经浏览了代码并确保所有新闻都有删除,并且没有指针被重新分配而不被首先删除等。
下面是分配内存块时的调用树。请注意,如果我在代码中注释掉此调用树,则该块将出现在我的代码中的不同位置,依此类推。
谢谢。