Valgrind를 사용했으며 코드가 insert() 및 buildName() 함수에서 메모리 누수 위치를 확인할 수 없습니다. Valgrind는 이러한 기능이 있다고 말하지만 정확한 위치를 정확히 알 수는 없습니다. 나는 코드로 메모리를 새기라는 개념에 대해 아주 새로운 것이다. 누구 한테 도움을 줘? 건배! 빈c - 이진 검색 트리 삽입으로 메모리 누수
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Node of tree */
typedef struct Node {
int order;
char value;
struct Node * left;
struct Node * right;
} Node;
Node * insert(Node * node, char value, int order){
if(node == NULL){
/* free(node); */
node = (Node *)malloc(sizeof(Node));
node->value = value;
node->order = order;
node->left = NULL;
node->right = NULL;
return node;
}
if(order > node->order){
node->right = insert(node->right, value, order);
}
else if(order < node->order){
node->left = insert(node->left, value, order);
}
return node;
}
char * buildName(const char * old, const char * newpart) {
char * dot;
char * buf = NULL;
dot = strrchr(old, '.');
if (dot) {
size_t len;
len = snprintf(NULL, 0, "%.*s%s.%s",
(int)(dot - old) + 1, old, newpart, dot + 1);
buf = malloc(len + 1);
if (buf) {
snprintf(buf, len + 1, "%.*s%s.%s",
(int)(dot - old) + 1, old, newpart, dot + 1);
}
}
return buf;
}
void decode(Node * root, Node * origRoot, char * bitString, char * filename) {
FILE * fp;
int i = 0;
fp = fopen(filename, "w");
if (fp) {
while(bitString[i] != '2'){
if(bitString[i] == '0'){
if(root->left == NULL && root->right == NULL) {
root = origRoot;
i--;
}
else root = root->left;
}
else if(bitString[i] == '1'){
if(root->right == NULL && root->left == NULL) {
root = origRoot;
i--;
}
else root = root->right;
}
if(root->value != -1){
fputc(root->value, fp);
printf("%c", root->value);
}
i++;
}
}
fclose(fp);
}
int main(int argc, char * argv[]){
FILE * fp;
Node * root = NULL;
char bitString[256];
char * filename;
int numNodes;
int value;
int order;
int i = 0;
char c;
if (argc < 2 || argc > 2) {
printf("No file specified or too many arguments. Exiting...\n");
exit(1);
}
fp = fopen(argv[1], "r");
if(!fp){
printf("Cound not open command file: %s", argv[1]);
return 0;
}
if(fp){
fscanf(fp, "%d", &numNodes);
while(i < numNodes){
fscanf(fp, "%d", &value);
fscanf(fp, "%d", &order);
root = insert(root, value, order);
i++;
}
i = 0;
while((c = fgetc(fp)) != EOF){
bitString[i] = c;
i++;
}
}
fclose(fp);
filename = buildName(argv[1], "decoded");
decode(root, root, bitString, filename);
return 0;
}
추가 :
void empty(Node * node) {
node = NULL;
if(node != NULL){
Node * left = node->left;
Node * right = node->right;
free(node);
if (left)
empty(left);
if (right)
empty(right);
}
}
valgrind 보고서에 대한 pastebin 링크를 포함 할 수 있습니까? 디버그 기호로 프로그램을 컴파일 한 경우 valgrind는 누수 된 메모리가 할당 된 행 번호를 제공해야합니다. – tkocmathla
프로그램 끝에 할당 된 메모리가 해제되지 않았습니다. 그 의미에서? – BLUEPIXY
"Leaking"은 프로그램을 종료하기 전에 런타임 동안 malloc() 된 메모리를 삭제하기 위해 free()를 호출하지 않는 것을 의미합니다. 트리를 걷고 malloc() 함수를 사용하여 메모리를 비우는 destroy_tree() 함수가 없으므로 malloc()을 insert()에 호출하여 할당 된 모든 메모리가 유출되었습니다. 마찬가지로 buildName에서는 malloc()을 사용하고 사용 후에 free()하지 않는 버퍼를 반환하므로 main()이 종료 될 때 메모리가 유출됩니다. – JohnH