Saya mengalami masalah dengan bagian kecil kode yang menghasilkan kesalahan di valgrind. Ketika saya mengomentari kode dan menjalankan valgrind, saya tidak mendapatkan kebocoran atau kesalahan memori apa pun sehingga loop ini yang menjadi penyebabnya:
///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);
}
setelah loop ini saya hanya mengembalikan enum yang menyatakan sukses.
Berikut kesalahan di 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
Fungsi ToStringUser mengembalikan malloc dari const char*.. Jadi saya tidak perlu khawatir untuk membebaskannya kan?
Adakah yang tahu mengapa ini terjadi?
Saya mencoba membebaskan str dengan kode ini tetapi saya tetap mendapatkan kesalahan yang sama dan jumlah kebocoran memori yang sama:
free((char*) str); OR free((void*) str);
Berikut adalah struct dari Pengguna dan getID dan getName:
struct User_t {
char *Name;
int ID;
int Birth;
};
int UserGetID(User user) {
return user->ID;
}
char* UserGetName(User user) {
return user->Name;
}
Sebelum loop saya menginisialisasi Pengguna baru dengan ini:
User user = FindUserPointer(setUser, id);
Fungsi yang digunakan adalah ini:
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;
}
user
dalam perulangan for? Dan program melakukan segfault pada fungsimtmSuggestFriends
, jadi mungkin berguna untuk melihatnya. - person huon   schedule 04.05.2012free()
di atasnya ;) Perhatikan bahwafree()
tidak mengubah nilai argumennya, meskipun itu tidak masalah. - person Philip   schedule 04.05.2012Invalid read of size 1
+SIGSEGV
), Anda harus memperbaikinya sebelum Anda terlalu khawatir tentangfree
ing memori. - person huon   schedule 04.05.2012const
untuk menyimpan hasilmalloc()
. Lagipula itu tidak masuk akal, karena Anda akan mengubah (yaitufree()
) penunjuk setelahnya. - person Philip   schedule 04.05.2012