无法在 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 指针也有同样的问题。

几个相关的注释:

  • 每次你发现自己在做 C 风格的转换时,你可能正在做一些你不应该做的事情。

  • c_str is considered read-only, trying to modify it leads to undefined behavior too. And modify that data you do, the strtok函数返回的数据修改您传递给它的字符串。

line 被未通过 malloc()line=(char*)sline.c_str(); 分配的内容覆盖。不要free()它。

statut 被未通过 malloc()statut = strtok(NULL," "); 分配的内容覆盖。不要free()它。

我在这个函数中没有发现对hash的任何覆盖,但它的缓冲区可能太小而无法存储带有终止空字符的字符串。