内存泄漏,我似乎找不到原因

熊猫突袭

因此,我正在编写一个用于管理堆数据结构的程序。我进行了两个动态内存分配,并且(我认为)在包装内容时我正确地释放了它们。

#include "heapFunctions.h"
#include "util.h"
#include <stdio.h>
#include <stdlib.h>

//Function Prototypes
static element* getArray(int*);

int main(void){
int result=0;
int i,v;
heap myHeap;
myHeap.H = NULL;
int arrayLength;
element* myArray = NULL;
char menuSelection = nextCommand(&i,&v);        //get selection from user
while(!(menuSelection == 'S' || menuSelection == 's')){
    switch(menuSelection){
        case 'c':
        case 'C':
            if(myHeap.H == NULL)
                myHeap = initialize(i);         //initialize heap and identify any errors
            else{
                free(myHeap.H);
                myHeap=initialize(i);
            }
            if(myHeap.H != NULL)
                printf("Command Entered %c. Heap Initialized with capacity %d\n", menuSelection, i);
            else
                printf("Command Entered %c. Heap space not allocated\n", menuSelection);
            break;
        case 'r':
        case 'R':
            if(myArray == NULL)
                myArray = getArray(&arrayLength);               //populate array from text file
            else{
                free(myArray);
                myArray = getArray(&arrayLength);
            }
            result=buildHeap(&myHeap, myArray, arrayLength);        //build heap with array
            if(result==1)
                printf("Command Entered %c. Heap was built with size %d\n", menuSelection, arrayLength);
            else if (result == -1)
                printf("Command Entered %c. Heap build was unsuccesful\n", menuSelection);
            else if (result == -2)
                printf("Command Entered %c. Heap capacity can't accomodate array\n", menuSelection);
            break;
        case 'w':
        case 'W':
            printf("Command Entered %c. Printing Heap\n", menuSelection);
            printHeap(&myHeap);                 //print contents of heap
            break;
        case 'i':
        case 'I':
            result = insert(&myHeap, i);            //insert new key i into heap
            if (result == 1)
                printf("Command Entered %c. Heap insert with key %d was succesful\n", menuSelection, i);
            else
                printf("Command Entered %c. Heap insert was unsuccesful\n", menuSelection);
            break;
        case 'd':
        case 'D':
            result = deleteMax(&myHeap);        //extract max value from heap
            if (result > 0)
                printf("Command Entered %c. Deletion of max heap value %d was succesful\n", menuSelection, result);
            break;
        case 'k':
        case 'K':
            result = increaseKey(&myHeap, i, v);            //increase key at index i to v
            if(result == 1)
                printf("Command Entered %c. Key was succesfully increased to %d at index %d\n", menuSelection, v, i);
            else if(result == -1)
                printf("Command Entered %c. Key increase failed, %d not a valid index\n", menuSelection, i);
            else if (result == -2)
                printf("Command Entered %c. Key increase failed, %d is not larger than current key\n", menuSelection, v);
            else if (result == -3)
                printf("Command Entered %c. Key increase failed, Index starts at 1!", menuSelection);
    }
    menuSelection = nextCommand(&i,&v); 
}
printf("You have entered command %c and stopped the program.\n", menuSelection);

//free resources
free(myArray);
free(myHeap.H);
return 1;
}

//get array from text file for heap
static element* getArray(int *Length){
    element *arrayKey;          //declare pointer for new array
    int arrayLength=0;
    char inputBuffer[10];
    FILE *fp;
    fp = fopen("HEAPinput.txt","r");            //open text file
    if (fp == NULL){                    /*check to make sure file was opened*/
        fprintf(stderr, "Cannot open input file!!\n");
        exit(1);
    }
    if(fgets(inputBuffer, sizeof(inputBuffer), fp) != NULL){        //get line of text
        sscanf(inputBuffer, "%d", &arrayLength);                //parse line for number of inputs
    }

    if(arrayLength < 1){                //error if array length is invalid
        printf("Invalid Array Length\n");
        exit(1);
    }

    arrayKey = (element *) malloc(sizeof(element)*arrayLength);     //dynamically allocate memory for values
    if(arrayKey == NULL){
        printf("Memory for array not allocated\n");
         exit(1);
    }   
    int count;

    for (count =0; count < arrayLength; count++){               //populate array with input from file
        fscanf(fp, "%d", &arrayKey[count].key);
    }

    *Length = arrayLength;  
    fclose(fp);                                             //close file
    return arrayKey;                        //return array      
}


//initialize new heap with size 0 and designated capacity
heap initialize(int capacity){
    heap myHeap;
    myHeap.size = 0;
    myHeap.capacity = capacity;
    myHeap.H = (element*) malloc(sizeof(element)*capacity);         //dynamically allocate memory blocks for heap with designated capacity
    return myHeap;
}

//copy contents of heap into H element,
int buildHeap(heap *myHeap, element * myArray, int arrayLength){
    if(arrayLength > myHeap->capacity)      //error if capacity is to small
        return -2;
    if(myHeap->H == NULL)
        return -3;
    if(memcpy(myHeap->H, myArray, sizeof(element)*arrayLength) == NULL)     //error if memory not allocated properly
        return -1;

    myHeap->size=arrayLength;               //set size to arrayLength

    int count=0;
    for(count=(arrayLength/2); count >= 0; count--){            //buildHeap
        heapify(myHeap, count);
    }
    return 1;

}

我不太确定这是如何工作的,我只是尝试发布我认为是必要的代码。我只动态地在两个位置分配内存,我以为在离开main之前可以正确释放它们。我看不到我还有什么地方可以泄漏。

我使用了valgrind并得到了错误

 LEAK SUMMARY:
 ==4042==    definitely lost: 13,546 bytes in 70 blocks
 ==4042==    indirectly lost: 53 bytes in 5 blocks
 ==4042==      possibly lost: 29 bytes in 2 blocks
 ==4042==    still reachable: 33,958 bytes in 53 blocks

我还让它打印了整个跟踪(带有调试符号),但是所有输出几乎都是相同的(对于大多数块,请重复以下内容)。我尝试使用带有-g标志和fulltrace的valgrind用gcc + g ++进行编译,但我仍然得到??? 用于mem定位之后的输出。

==5804== 3 bytes in 1 blocks are possibly lost in loss record 2 of 97
==5804==    at 0x4C2C73C: malloc (vg_replace_malloc.c:270)
==5804==    by 0x440137: ??? (in /usr/bin/g++-4.7)
==5804==    by 0x43CDEB: ??? (in /usr/bin/g++-4.7)
==5804==    by 0x414C80: ??? (in /usr/bin/g++-4.7)
==5804==    by 0x41592F: ??? (in /usr/bin/g++-4.7)
==5804==    by 0x40296E: ??? (in /usr/bin/g++-4.7)
==5804==    by 0x4E5576C: (below main) (libc-start.c:226)


349 (320 direct, 29 indirect) bytes in 2 blocks are definitely lost in loss record          73 of 96
==4098==  at 0x4C2C92E: realloc (vg_replace_malloc.c:662)

关于我为什么泄漏内存,任何人都可以为我指出正确的方向。

戴夫·拉格(Dave Rager)

这是一个泄漏:

case 'R':
    myArray = getArray(&arrayLength);               //populate array from text file

我不确定执行“ R”菜单选择有多少次,但是myArray在while循环中从未释放过。每次执行此选择时,您都会泄漏myArray以前指向的内存退出while循环后,您仅释放最后分配的内存位置。

同样与“ C”:

case 'C':
    myHeap = initialize(i);         //initialize heap and identify any errors

如果多次执行此操作,则会泄漏myHeap先前指向的内存退出循环后,您只能释放分配给的最后一个内存位置myHeap.H

更新:

在最新更新中,您现在需要初始化变量。由于它们生活在堆栈中,因此很可能包含垃圾。例如,第一次检查时,myArray == NULL它很可能会返回false,从而导致您尝试释放尚未分配的内存。

heap myHeap;
myHeap.H = NULL;

element* myArray = NULL;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我找不到的C ++内存泄漏

来自分类Dev

在Swift应用中找不到内存泄漏

来自分类Dev

我似乎找不到的错误

来自分类Dev

我似乎找不到的语法错误

来自分类Dev

JAVA帮助,我似乎找不到错误

来自分类Dev

找不到D3.js内存泄漏

来自分类Dev

作业:我在某处内存泄漏,但找不到。关于如何更有效地使用valgrind的任何提示?

来自分类Dev

两个Scrapy蜘蛛的示例,其中一个存在内存泄漏,我找不到它

来自分类Dev

StackOverFlow-异常?我找不到原因:-(

来自分类Dev

我的循环停止了,但找不到原因

来自分类Dev

我的游戏有性能泄漏,我找不到它

来自分类Dev

Java-javax.json-编译错误:.getValueType()的“找不到符号”-似乎找不到原因

来自分类Dev

Django内存泄漏:可能的原因?

来自分类Dev

我的代码错了吗?我似乎找不到答案

来自分类Dev

不能似乎使我的Jbutton锁定。错误:找不到符号

来自分类Dev

似乎找不到我的$ _POST有什么问题

来自分类Dev

我似乎找不到从Firebase提取特定记录的方法

来自分类Dev

我找不到valgrind告诉我的内存链接

来自分类Dev

我找不到此堆栈溢出异常的原因

来自分类Dev

.panel周围的透明边框使我发疯。找不到原因

来自分类Dev

Django,无法导入名称~~错误,但我找不到原因

来自分类Dev

PHP/JS 处理请求失败,我找不到原因

来自分类Dev

如何解决wxPython / wxFormBuilder中的“ wxPyXmlSubclassFactory *类型的内存泄漏,找不到析构函数”错误?

来自分类Dev

Android中内存泄漏的潜在原因

来自分类Dev

iOS中内存泄漏的可能原因?

来自分类Dev

页面上的灰线,边框似乎位于我似乎找不到的顶部/底部

来自分类Dev

Applet似乎找不到资源

来自分类Dev

Applet似乎找不到资源

来自分类Dev

找不到存储过程的原因

Related 相关文章

  1. 1

    我找不到的C ++内存泄漏

  2. 2

    在Swift应用中找不到内存泄漏

  3. 3

    我似乎找不到的错误

  4. 4

    我似乎找不到的语法错误

  5. 5

    JAVA帮助,我似乎找不到错误

  6. 6

    找不到D3.js内存泄漏

  7. 7

    作业:我在某处内存泄漏,但找不到。关于如何更有效地使用valgrind的任何提示?

  8. 8

    两个Scrapy蜘蛛的示例,其中一个存在内存泄漏,我找不到它

  9. 9

    StackOverFlow-异常?我找不到原因:-(

  10. 10

    我的循环停止了,但找不到原因

  11. 11

    我的游戏有性能泄漏,我找不到它

  12. 12

    Java-javax.json-编译错误:.getValueType()的“找不到符号”-似乎找不到原因

  13. 13

    Django内存泄漏:可能的原因?

  14. 14

    我的代码错了吗?我似乎找不到答案

  15. 15

    不能似乎使我的Jbutton锁定。错误:找不到符号

  16. 16

    似乎找不到我的$ _POST有什么问题

  17. 17

    我似乎找不到从Firebase提取特定记录的方法

  18. 18

    我找不到valgrind告诉我的内存链接

  19. 19

    我找不到此堆栈溢出异常的原因

  20. 20

    .panel周围的透明边框使我发疯。找不到原因

  21. 21

    Django,无法导入名称~~错误,但我找不到原因

  22. 22

    PHP/JS 处理请求失败,我找不到原因

  23. 23

    如何解决wxPython / wxFormBuilder中的“ wxPyXmlSubclassFactory *类型的内存泄漏,找不到析构函数”错误?

  24. 24

    Android中内存泄漏的潜在原因

  25. 25

    iOS中内存泄漏的可能原因?

  26. 26

    页面上的灰线,边框似乎位于我似乎找不到的顶部/底部

  27. 27

    Applet似乎找不到资源

  28. 28

    Applet似乎找不到资源

  29. 29

    找不到存储过程的原因

热门标签

归档