为什么会出现内存泄漏?(C)
其他信息: 该函数只调用一次 这段代码调用函数:为什么会出现内存泄漏?(C),c,memory-leaks,C,Memory Leaks,其他信息: 该函数只调用一次 这段代码调用函数:game\u session=new\u game(w,h,playerno) game\u会话初始化为NULL(0)。因此,总结一下我学到的内容: 可视泄漏检测器,泄漏消毒剂(内存泄漏检测工具) 当主功能返回时内存未释放时检测泄漏。 因为大部分情况下,它是泄漏的。C语言不适合你 清楚地显示哪些内存自动释放,哪些不自动释放 你真的不必释放内存,只要让检漏仪静音就行了。 但是释放内存是一个很好的做法 -n.m 在我看来,总是释放记忆。 即使是几字节的
game\u session=new\u game(w,h,playerno)代码>
game\u会话
初始化为NULL(0)。因此,总结一下我学到的内容:
可视泄漏检测器
,泄漏消毒剂
(内存泄漏检测工具)
当主功能返回时内存未释放时检测泄漏。
因为大部分情况下,它是泄漏的。C语言不适合你
清楚地显示哪些内存自动释放,哪些不自动释放
你真的不必释放内存,只要让检漏仪静音就行了。
但是释放内存是一个很好的做法
-n.m
在我看来,总是释放记忆。
即使是几字节的内存泄漏也可能积累得非常快。因为未释放的每个分配内存都被泄漏检测器视为内存泄漏。这个是。@n.m.那么,分配的内存必须在代码结束时释放?不,必须在释放最后一个指向它的指针之前释放内存。那可能是在程序结束时。你不必释放内存。内存泄漏并不(总是)致命。但这是一个很好的做法,释放一切,如果只是沉默泄漏检测器。因为当你有一个真正的漏洞时,你有可能在“无关紧要”的误报噪音中漏掉它。在退出程序之前释放所有内存后,问题就解决了。谢谢大家!我们所说的是分配一次的内存,直到程序结束为止。你释放它,但不是因为它累积。@n.m.我认为这是一个很好的理由。除此之外,还有什么问题?安全性?它根本不会累积,它只分配一次,当你释放它时,程序无论如何都会结束,所以它不能成为理由。正如我所说的,释放这些内存的原因是保持日志干净,因为你不这样做,你迟早会错过一个真正的问题,因为它会在噪音中丢失。
struct game_t {
int playercount;
int board_width, board_height;
int turn_of;//player number
int eleminatedPlayer[MAX_PLAYERS];
int turn;
int cellcnt[MAX_PLAYERS];
grid_t** board;
move_t* moves;
};
game_t* new_game(int width, int height, int playercount)
{
int i;
game_t* newgame;
newgame = (game_t*)calloc(1,sizeof(game_t)); // <line 181
newgame->board_height = height;
newgame->board_width = width;
newgame->playercount = playercount;
newgame->turn_of = 0;//Red(player 0)
zero_fill_arr((char*)newgame->eleminatedPlayer, sizeof(int)*MAX_PLAYERS);
zero_fill_arr((char*)newgame->cellcnt, sizeof(int)*MAX_PLAYERS);
newgame->moves = (move_t*)calloc(MAX_MOVES, sizeof(move_t));
newgame->board = (grid_t**)calloc(width, sizeof(grid_t**));
for (i = 0; i < width; i++)
{
newgame->board[i] = (grid_t*)calloc(height, sizeof(grid_t));
}
return newgame;
}
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x00EA5B20: 76 bytes ----------
Leak Hash: 0xE1234C8B, Count: 1, Total 76 bytes
Call Stack (TID 3264):
ucrtbased.dll!calloc()
atoms.c (181): Atoms.exe!new_game() + 0xC bytes
atoms.c (120): Atoms.exe!main() + 0x1A bytes
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (64): Atoms.exe!invoke_main() + 0x1B bytes
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (253): Atoms.exe!__scrt_common_main_seh() + 0x5 bytes
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (296): Atoms.exe!__scrt_common_main()
f:\dd\vctools\crt\vcstartup\src\startup\exe_main.cpp (17): Atoms.exe!mainCRTStartup()
KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
ntdll.dll!RtlSubscribeWnfStateChangeNotification() + 0x439 bytes
ntdll.dll!RtlSubscribeWnfStateChangeNotification() + 0x404 bytes
Data:
02 00 00 00 03 00 00 00 03 00 00 00 00 00 00 00 ........ ........
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ........ ........
00 00 00 00 60 05 EB 00 58 6D EB 00 ....`... Xm......