我目前正在用C ++开发一个项目,在一个模块中,我遇到了一个问题:我无法释放我的指针。 问题是用字符串操纵char *。 我需要使用char *作为openssl lib和strtok(我知道这不是唯一的方法,但我更喜欢使用它,因为它似乎更难以采用" C ++方式")。
我不明白为什么我不能释放评论的字母*,("无效的自由指针,放弃")
您有想法和解决方案吗? 感谢' S
string* traitement_req1(string& affectation) {
string nom;
char* statut=(char*)malloc(sizeof(char)*30);
char* hash=(char*)malloc(SHA_DIGEST_LENGTH*sizeof(char));
char* token=(char*)malloc(30*sizeof(char));
string readAffectation;
string hashlist;
string hashS;
string * finalList = new string[2];
string listnom;
string fichier = "test.txt";
ifstream file(fichier.c_str(), ios::in);
if(file){
char* line= (char*)malloc(BUF_SIZE * sizeof(char));
string sline=line;
while (getline(file,sline)){
line=(char*)sline.c_str();
nom = string(strtok(line, " "));
statut = strtok(NULL," ");
readAffectation =string(strtok(NULL," "));
if (affectation == readAffectation){
SHA_CTX ctx;
SHA1_Init(&ctx);
SHA1_Update(&ctx, statut, strlen(statut));
SHA1_Final((unsigned char*)hash, &ctx);
hashS=string(hash,strlen(hash));
hashlist += hashS;
hashlist += "\n";
listnom += nom;
listnom += "\n";
}
}
file.close();
//free(hash);
//free(line);
//free(statut);
finalList[0] = hashlist;
finalList[1] = listnom;
return finalList;
}
else {
printf("error : ouverture impossible!\n");
exit(EXIT_FAILURE);
}
}
答案 0 :(得分:4)
除了在编写C ++时使用旧C风格字符串的问题,这是一个很大的问题:
您为line
分配内存
char* line= (char*)malloc(BUF_SIZE * sizeof(char));
然后你要做几行
line=(char*)sline.c_str();
这会更改line
,因此它不再指向您分配的内存,现在尝试释放它将导致未定义的行为。
statut
指针存在同样的问题。
一些相关的说明:
答案 1 :(得分:1)
line
被malloc()
line=(char*)sline.c_str();
未分配的内容覆盖。不要free()
。
statut
被malloc()
statut = strtok(NULL," ");
未分配的内容覆盖。不要free()
。
我在这个函数中没有发现hash
的覆盖,但是它的缓冲区可能太小而无法存储带有终止空字符的字符串。