无法在C ++中释放char *

时间:2015-11-27 15:02:33

标签: c++ pointers free

我目前正在用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); 
        }                       
}

2 个答案:

答案 0 :(得分:4)

除了在编写C ++时使用旧C风格字符串的问题,这是一个很大的问题:

您为line分配内存

char* line= (char*)malloc(BUF_SIZE * sizeof(char)); 

然后你要做几行

line=(char*)sline.c_str(); 

这会更改line,因此它不再指向您分配的内存,现在尝试释放它将导致未定义的行为

statut指针存在同样的问题。

一些相关的说明:

  • 每当你发现自己正在进行C风格演员表演时,你可能正在做一些你不应该做的事情。

  • c_str返回的数据被视为只读,尝试修改它也会导致未定义的行为。并修改您执行的数据,strtok函数修改您传递给它的字符串。

答案 1 :(得分:1)

linemalloc() line=(char*)sline.c_str();未分配的内容覆盖。不要free()

statutmalloc() statut = strtok(NULL," ");未分配的内容覆盖。不要free()

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