无法在 C++ 中释放 char*
Can't free char* in C++
我目前正在用 C++ 开发一个项目,在一个模块中,我遇到了一个问题:我无法释放我的指针。
问题是对 char* 与字符串的操作。
我需要将 char * 用于 openssl 库和 strtok(我知道这不是唯一的方法,但我更喜欢使用它,因为它在 "C++ way" 中似乎更难)。
我不明白为什么我不能释放评论的 char*,("unvalid free pointer, Abandon")
你有想法和解决方案吗?
谢谢
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);
}
}
除了为什么在 C++ 编程时使用旧的 C 风格字符串的问题,还有一个大问题:
你这样为line
分配内存
char* line= (char*)malloc(BUF_SIZE * sizeof(char));
然后再写几行
line=(char*)sline.c_str();
这会更改 line
,因此它不再指向您分配的内存,现在尝试释放它会导致 未定义的行为。
您对 statut
指针也有同样的问题。
几个相关的注释:
line
被未通过 malloc()
在 line=(char*)sline.c_str();
分配的内容覆盖。不要free()
它。
statut
被未通过 malloc()
在 statut = strtok(NULL," ");
分配的内容覆盖。不要free()
它。
我在这个函数中没有发现对hash
的任何覆盖,但它的缓冲区可能太小而无法存储带有终止空字符的字符串。
我目前正在用 C++ 开发一个项目,在一个模块中,我遇到了一个问题:我无法释放我的指针。 问题是对 char* 与字符串的操作。 我需要将 char * 用于 openssl 库和 strtok(我知道这不是唯一的方法,但我更喜欢使用它,因为它在 "C++ way" 中似乎更难)。
我不明白为什么我不能释放评论的 char*,("unvalid free pointer, Abandon")
你有想法和解决方案吗? 谢谢
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);
}
}
除了为什么在 C++ 编程时使用旧的 C 风格字符串的问题,还有一个大问题:
你这样为line
分配内存
char* line= (char*)malloc(BUF_SIZE * sizeof(char));
然后再写几行
line=(char*)sline.c_str();
这会更改 line
,因此它不再指向您分配的内存,现在尝试释放它会导致 未定义的行为。
您对 statut
指针也有同样的问题。
几个相关的注释:
line
被未通过 malloc()
在 line=(char*)sline.c_str();
分配的内容覆盖。不要free()
它。
statut
被未通过 malloc()
在 statut = strtok(NULL," ");
分配的内容覆盖。不要free()
它。
我在这个函数中没有发现对hash
的任何覆盖,但它的缓冲区可能太小而无法存储带有终止空字符的字符串。