gpt4 book ai didi

结构中的 char* 未被 cleanUp 函数释放()

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

我读到使用 malloc() 时的规则是始终有一个匹配的 free()。如果一个程序中使用了 7 次 malloc(),则必须有相应数量的 free()。但是,这似乎不适用于我在结构内部 malloc 的几个 char*。结构:

typedef struct
{
char* ID;
char* PassWord;
}Account, *pAccount, **ppAccount;

typedef struct
{
unsigned int numAccounts;
ppAccount accounts;
}Collection,*pAccountCollection;

mallocs(函数简化):

void AddNewAccount(pAccountCollection e){
int string_length = sizeof(char)*26;
pAccount newAct = malloc(sizeof(Account));

newAct->ID = malloc(string_length);
newAct->PassWord = malloc(string_length);
e ->numAccounts++;

e->accounts[e->numAccounts-1] = newAct;
}

最后,最后调用清理:

void CleanUp(pAccountCollection e){
unsigned int i;

if(e->numAccounts != 0){
for (i = 0; i < e->numAccounts; i++){
free(e->accounts[i]->ID);
free(e->accounts[i]->PassWord);
free(e->accounts[i]);
}
free(e->accounts);
}
}

我正在检查是否有泄漏

    _CrtDumpMemoryLeaks();
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);

并且它将 newAct 的 ID 和密码标记为未释放的 26 个字节。

 Detected memory leaks!
Dumping objects ->
{73} normal block at 0x006F9268, 26 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{72} normal block at 0x006F45E8, 26 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD

如果我像这样在函数结束时释放它们:

void AddNewAccount(pAccountCollection e){
int string_length = sizeof(char)*26;
pAccount newAct = malloc(sizeof(Account));

newAct->ID = malloc(string_length);
newAct->PassWord = malloc(string_length);

e->accounts[e->numAccounts-1] = newAct;
free(newAct->ID);
free(newAct->PassWord);
}

我在帐户集合 AccountCollection e 中丢失了对该帐户的引用。

有什么见解吗?

最佳答案

您的 AddNewAccount 函数永远不会递增 e->numAccounts,因此 CleanUp 总是像 Collection不包含帐户,因此什么也不做。

关于结构中的 char* 未被 cleanUp 函数释放(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32590951/

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