gpt4 book ai didi

c - 查找C中的内存泄漏

转载 作者:行者123 更新时间:2023-11-30 14:24:17 24 4
gpt4 key购买 nike

我正在尝试在以下代码中查找内存泄漏。 valgrind 给了我这个:

==14160== 1,850 (592 direct, 1,258 indirect) bytes in 9 blocks are definitely lost in loss    record 2 of 5
==14160== at 0x4904A06: malloc (vg_replace_malloc.c:149)
==14160== by 0x405B1F: tsCreate (ticket_set.c:55)
==14160== by 0x401ECA: test1TS (main.c:62)
==14160== by 0x40557C: main (main.c:424)

这是函数:

TicketSetStatus tsCreate(TicketSet* t, int n, int c) {
if(t==NULL){
return TS_CANNOT_CREATE;
}
if (n <= 0){
return TS_ILLEGAL_PARAMETER;
}

t->usedTravels = 0;
t->originalTravels = n;
t->cost = c;
t->moneyLeft = n * c;
//Date time is array of travels:
t->dates = malloc(sizeof(DateTime *)* (n)); //todo maybe c99 allows dynamic arrays?
for (int i = 0; i < n; i++) {
t->dates[i] = malloc(sizeof(char)*GOOD_LENGTH+1);
if (t->dates[i] == NULL) {
free( t->dates);

return TS_CANNOT_CREATE;
}
}

return TS_SUCCESS;
}

TicketSetStatus tsDestroy(TicketSet* t, int* moneyLeft) {
if (t == NULL) {
return TS_FAIL;
}
*moneyLeft = (t->cost) * (t->originalTravels-t->usedTravels);

for (int i = 0; i < t->originalTravels; i++){
free(t->dates[i]);
}
free(t->dates);

t=NULL;
return TS_SUCCESS;
}

当结构是:

struct TS_element {
int usedTravels;
int originalTravels;
int cost;
DateTime* dates;
int moneyLeft;
};

typedef char* DateType

实际上,使用 free 会使程序崩溃,所以只要程序正常运行,我倾向于忍受内存泄漏。

最佳答案

您如何使用这个 DateTime 数组?如果你稍后再践踏这些值,就会出现泄漏。也许对字符串赋值感到困惑?

char someDateValue[] = "2012-08-15";
t->dates[0] = someDateValue; // Leak -- your allocated string is lost

相反:

strcpy( t->dates[0], someDateValue );

tsCreate 中的错误情况存在明确的泄漏:

for (int i = 0; i < n; i++) {
t->dates[i] = malloc(sizeof(char)*GOOD_LENGTH+1);
if (t->dates[i] == NULL) {
free(t->dates); // Leak -- every element up to i-1 is lost
return TS_CANNOT_CREATE;
}
}

在完成 tsCreate 初始化的数据后,您是否正在调用 tsDestroy ?也许您从 main 返回时没有进行清理。

如果这些都没有帮助,您应该发布额外的代码来显示您如何使用数据结构。

关于c - 查找C中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11963940/

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