2015-11-27 24 views
-1

不是免費的char *我目前在C++深化發展的項目,並在一個模塊裏,我有一個問題:我不能釋放我的指針。 問題是用字符串處理char *。 我需要使用的char *爲OpenSSL的lib和strtok的(我知道這是不是這樣做的唯一方式,但我更喜歡使用它,因爲它似乎更難以在「C++的方式」)。可以在C++

我不明白爲什麼我不能釋放評論的char *,(「unvalid免費指針,摒棄」)

你有一個想法,一個解決方案嗎? 感謝的

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

是存在的,爲什麼你使用'malloc'和'free'任何正當理由嗎?我有我的懷疑。 – user463035818

+4

爲什麼你甚至使用'malloc'?我假設'SHA_DIGEST_LENGTH'和'BUF_SIZE'是常量,所以只需要在棧上使用一個數組。不需要釋放任何東西 – Kevin

回答

4

除了你爲什麼編程C本時使用舊的C風格的字符串的問題++,這裏是一個很大的問題:

你爲line分配內存這樣

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

然後你做幾條線

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

這改變line所以它不再指向你分配的內存,現在試圖釋放會導致未定義行爲

你必須與statut指針同樣的問題。

一對夫婦的相關注意事項:

  • 每當你發現自己做一個C風格的演員,你可能做的事情,你不應該這樣做。

  • c_str返回的數據被認爲是只讀,試圖修改它會導致未定義的行爲。並修改你所做的數據,strtok函數修改你傳遞給它的字符串。

1

line通過經malloc()line=(char*)sline.c_str();未分配的東西覆蓋。不要free()吧。

statut被未通過malloc()statut = strtok(NULL," ");分配的東西覆蓋。不要free()吧。

我沒有找到這個功能hash任何覆蓋,但它的緩衝區可能太小存儲與終止空字符的字符串。