gpt4 book ai didi

c - 这个小 for 循环中的内存泄漏和 valgrind 错误?

转载 作者:太空宇宙 更新时间:2023-11-04 01:12:02 25 4
gpt4 key购买 nike

我在处理在 valgrind 中生成错误的一小部分代码时遇到了问题。当我注释代码并运行 valgrind 时,我没有遇到任何内存泄漏或错误,所以这个循环应该是原因:

///Print the top users
const char* str;
for (int i = 0; i < count; i++) {
if (FinalArray[i].Score == -1) {
break;
}

int id = UserGetID(user);
char* name = UserGetName(user);
int finalID = UserGetID(FinalArray[i].user);
char* finalName = UserGetName(FinalArray[i].user);

assert(finalName!= NULL && name !=NULL);
str = mtmSuggestFriends(id, name, finalID, finalName);

if (str == NULL) {
return MAIN_ALLOCATION_FAILED;
}

// fprintf(fileOutput, str);
}

在这个循环之后我简单地返回一个枚举说明成功。

以下是 Valgrind 中的错误:

==8779== Use of uninitialised value of size 8
==8779== at 0x4037C2: UserGetName (in /u1/023/mtm/ex2/RUN/mtm_isocial)
==8779== by 0x401FAC: SuggestFriends (in /u1/023/mtm/ex2/RUN/mtm_isocial)
==8779== by 0x402E6D: executeUserCommand (in /u1/023/mtm/ex2/RUN/mtm_isocial)
==8779== by 0x40281B: main (in /u1/023/mtm/ex2/RUN/mtm_isocial)
==8779==
==8779== Use of uninitialised value of size 8
==8779== at 0x4037A0: UserGetID (in /u1/023/mtm/ex2/RUN/mtm_isocial)
==8779== by 0x401FC8: SuggestFriends (in /u1/023/mtm/ex2/RUN/mtm_isocial)
==8779== by 0x402E6D: executeUserCommand (in /u1/023/mtm/ex2/RUN/mtm_isocial)
==8779== by 0x40281B: main (in /u1/023/mtm/ex2/RUN/mtm_isocial)
==8779==
==8779== Invalid read of size 1
==8779== at 0x403F1A: mtmSuggestFriends (in /u1/023/mtm/ex2/RUN/mtm_isocial)
==8779== by 0x401FEE: SuggestFriends (in /u1/023/mtm/ex2/RUN/mtm_isocial)
==8779== by 0x402E6D: executeUserCommand (in /u1/023/mtm/ex2/RUN/mtm_isocial)
==8779== by 0x40281B: main (in /u1/023/mtm/ex2/RUN/mtm_isocial)
==8779== Address 0x9848B4458BB44589 is not stack'd, malloc'd or (recently) free'd
==8779==
==8779== Process terminating with default action of signal 11 (SIGSEGV)
==8779== General Protection Fault
==8779== at 0x403F1A: mtmSuggestFriends (in /u1/023/mtm/ex2/RUN/mtm_isocial)
==8779== by 0x401FEE: SuggestFriends (in /u1/023/mtm/ex2/RUN/mtm_isocial)
==8779== by 0x402E6D: executeUserCommand (in /u1/023/mtm/ex2/RUN/mtm_isocial)
==8779== by 0x40281B: main (in /u1/023/mtm/ex2/RUN/mtm_isocial)
==8779==
==8779== ERROR SUMMARY: 3 errors from 3 contexts (suppressed: 4 from 1)
==8779== malloc/free: in use at exit: 1,250 bytes in 93 blocks.
==8779== malloc/free: 455 allocs, 362 frees, 10,081 bytes allocated.
==8779== For counts of detected errors, rerun with: -v
==8779== searching for pointers to 93 not-freed blocks.
==8779== checked 122,512 bytes.
==8779==
==8779== LEAK SUMMARY:
==8779== definitely lost: 0 bytes in 0 blocks.
==8779== possibly lost: 0 bytes in 0 blocks.
==8779== still reachable: 1,250 bytes in 93 blocks.
==8779== suppressed: 0 bytes in 0 blocks.
==8779== Reachable blocks (those to which a pointer was found) are not shown.
==8779== To see them, rerun with: --show-reachable=yes

ToStringUser 函数返回一个 const char* 的 malloc。所以我不应该担心释放它吗?

知道为什么会这样吗?

我试图在 for 中使用此代码释放 str,但我不断收到相同的错误和相同数量的内存泄漏:

free((char*) str); OR free((void*) str);

这是 User 和 getID 和 getName 的结构:

struct User_t {
char *Name;
int ID;
int Birth;
};
int UserGetID(User user) {
return user->ID;
}
char* UserGetName(User user) {
return user->Name;
}

在循环之前我用这个初始化一个新用户:

User user = FindUserPointer(setUser, id);

使用的函数是这样的:

static User FindUserPointer(Set users, int ID) {
assert(users!=NULL);
User tmpUser = UserCreate("temp", ID, 99);
if (tmpUser == NULL) {
return NULL;
}
SET_FOREACH(User,Itrator1,users) {
if (UserCompare(tmpUser, Itrator1) == 0) {
UserFree(tmpUser);
return Itrator1;
}
}
UserFree(tmpUser);
return NULL;
}

最佳答案

Valgrind 并不是在提示泄漏 - 它是在提示您正在读取未初始化的内存并取消引用无效指针(无效指针 deref 正在使程序崩溃 - 至少在 Valgrind 下是这样)。

我们需要查看 UserGetID()UserGetName() 才能确定其中的错误(但这可能还不够)。

根据您的评论,mtmSuggestFriends 是一个您没有源代码的目标文件,我的猜测是 UsetGetID() 和/或 UserGetName () 将无效指针传递给 mtmSuggestFriends

关于c - 这个小 for 循环中的内存泄漏和 valgrind 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10444071/

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