程序显示内存泄漏,即使使用free()

时间:2016-01-03 21:25:17

标签: c malloc

我是malloc()的新手,并且正在阅读我的书籍和一些有关它的教程。既然我已经编写了我的作业,那就要求你没有任何内存泄漏。

这是我的代码的一部分,我是如何用main编写的:

#define _CRTDBG_MAP_ALLOC
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <crtdbg.h>
int main()
{   
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    srand((unsigned)time(NULL)); //Kallas för randomisera ett nummer tidsmässigt
    struct CardDeck * deck; //Dynamiskt allokerad array
    int index;
    int suit_index;
    /*int i;  kan användas om man vill loopa kortleken*/
    deck = (struct CardDeck *)malloc(sizeof(struct CardDeck)); //Bör bara användas en gång med tanke på att vi bara har en pekare under vår struct i cardeck
    deck->last_Index = 0; //Pekar på senaste indexen för att se så att kortleken är full. 
    for (suit_index = 0; suit_index < NR_OF_SUITS; suit_index++)    //Loopar 4 (avser färgerna)
        for (index = 0; index < COLOR_SIZE; index++) //Loopar 13 gånger för varje värde i kortleken
        {
            deck->cards[suit_index*COLOR_SIZE + index].suit = suit_index;
            deck->cards[suit_index*COLOR_SIZE + index].value = index;
        }
    /*for (i = 0; i < 52; i++) {
    printCards(deck);
    }  Om man vill loopa igenom hela kortleken (sorterad) så finns den möjlig*/

    shuffleCards(deck->cards); 
    play(deck);
    system("pause");
    return 0;
    free(deck);
}

如您所见,我在底部使用了free(deck),这是我缺少的东西还是我做错了什么?

2 个答案:

答案 0 :(得分:6)

您的free()语句在return之后,您认为它执行了吗?您可以仔细尝试格式化代码,然后可以避免这种错误。

答案 1 :(得分:1)

问题是,您尝试在free()声明后调用return

执行到达无条件return语句后,控件将返回给调用者,并且return语句后面的任何语句都将是无法访问的代码。因此,基本上,您对free()的调用根本没有机会执行。

引用标准,章节§6.8.6.4

  

return语句终止当前函数的执行并将控制权返回给   它的来电者。 [...]

基本上,你的free()没有机会释放动态分配的内存,导致内存泄漏。

您需要在 free()声明之前致电return ,例如

. . . . 
free(deck);
return 0;