gpt4 book ai didi

c - 我的程序泄漏内存了吗?

转载 作者:太空宇宙 更新时间:2023-11-04 05:33:27 26 4
gpt4 key购买 nike

我正在学习 C,为了以一种有趣的方式更好地掌握一些主题,我写了一些可以进行连续分配/取消分配的东西。这是代码

#include <stdlib.h>
#include <stdint.h>

int main( void )
{
uint16_t i, j, k, l, m, n = 10, z = 25;
int64_t ******v;

while ( n-- )
{
v = malloc( sizeof( int64_t ***** ) * z );

for ( i = 0; i < z; ++i )
{
v[ i ] = malloc( sizeof( int64_t **** ) * z );

for ( j = 0; j < z; ++j )
{
v[ i ][ j ] = malloc( sizeof( int64_t *** ) * z );

for ( k = 0; k < z; ++k )
{
v[ i ][ j ][ k ] = malloc( sizeof( int64_t ** ) * z );

for ( l = 0; l < z; ++l )
{
v[ i ][ j ][ k ][ l ] = malloc( sizeof( int64_t * ) * z );

for ( m = 0; m < z; ++m )
v[ i ][ j ][ k ][ l ][ m ] = malloc( sizeof( int64_t ) * z );
}
}
}
}

for ( i = 0; i < z; ++i )
{
for ( j = 0; j < z; ++j )
{
for ( k = 0; k < z; ++k )
{
for ( l = 0; l < z; ++l )
{
for ( m = 0; m < z; ++m )
free( v[ i ][ j ][ k ][ l ][ m ] );

free( v[ i ][ j ][ k ][ l ] );
}
free( v[ i ][ j ][ k ] );
}
free( v[ i ][ j ] );
}
free( v[ i ] );
}
free( v );
}

return 0;
}

我在 Windows x64 上,所以指针大小是 8 个字节。所以如果我的计算是正确的,程序应该分配 ~2.03GB 的内存。
但实际上,它分配了 ~2.7GB。
此外,每次 while 循环迭代后,内存消耗都会增加 ~2MB。
最后,在 while 循环的第 8 次迭代之后,在所有 free() 之后,taskmgr 仍然显示程序持有 ~1.4GB RAM,即使下一次分配仍在通常最高为 ~2.7GB。

问题是:我的数学错了吗?每次迭代额外的 ~2MB 怎么样?而 unfree()d ~1.4GB 内存?发生了什么事?

最佳答案

不,这不是内存泄漏。

当您使用 malloc 请求 x 字节时,超过 x 字节被用完,部分是为了为内存头以及任何其他簿记创建空间。有关详细信息,请参阅此答案 Malloc header contents

关于c - 我的程序泄漏内存了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50499397/

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