2016-02-28 82 views
0

本期常量char *的字符串構造函數改變常量char *的值?

一個const char *的值似乎正在改變,以一個荒謬的價值。

故障代碼示例

下面的代碼的意圖是創建具有 BASEDIR的值的字符串。這個過程應該保持的值基於不變;然而,它莫名其妙地改變。

ProcessInfo get_process(int pid, const char* basedir) { 
cout<<basedir<<endl; 
string basedir_str=basedir; 
cout<<basedir<<endl; 
....} 

電流輸出

./proc/16224/task 
▒▒v▒=+ 

出了什麼問題與爲const char *字符串賦值?

基本目錄的設置

變量 BASEDIR被用在 「父」 功能get_all_processes呼叫分配。

父函數

vector<ProcessInfo> get_all_processes(const char* basedir) { 
DIR* dir; 
struct dirent *entry; 
vector<ProcessInfo> totalProcesses; 
//check to see if basedir can be opened 
if((dir =opendir(basedir))!=NULL){ 

    while((entry = readdir(dir)) != NULL){ 
     int pid = atoi (entry->d_name); 
     if(pid <=0){ 
      continue; 
     } 
     else{ 

     ProcessInfo currentProcess = get_process(pid, basedir); //<--call to get_process 

     totalProcesses.push_back(currentProcess); 
     } 
    } 
    closedir(dir); 
} 


return totalProcesses; 
} 

呼叫到父函數

myProcessInfo.threads=get_all_processes(threadList_fileName); 
//threadList_filename='./proc/[pid]/task', in this case pid =16224 

解決方案

消除臨時爲const char * threadList_fileName並更改 get_all_processes函數的參數。 myProcessInfo.threads=get_all_processes(("./proc/"+pid_str+"/task").c_str());

+1

這可能是由於字符串賭注不是以NULL結尾?該參考文件說它導致了未定義的行爲。 – iksemyonov

回答

4

它看起來像變量「basedir」已經指向你不擁有的內存。只是巧合,它仍然保持着你賦予它的價值。通過爲字符串「basedir_str」分配內存,該內存將被重用並被其他數據覆蓋。所以你的問題在函數「get_process」之外。

你如何分配「basedir」?

+0

感謝您的回答@cwschmidt。當調用父函數時,_basedir_被設置。它的值是'(「./proc /」+ pid_str +「/ task」)。c_str()'。我已經通過_cout_語句驗證了pid_str是否正確。 – Zephyr

+2

@Zephyr如果'pid_str'是一個'std :: string',那麼'c_str()'的結果只有在下一個';'之前纔有效。它指向的內存將在此之後被釋放 –

+0

@ M.M非常感謝!我刪除了const char * threadList_fileName =(「./ proc /」+ pid_str +「/ task」)。c_str();'並用c_str()的立即結果調用父函數。以下解決它:'myProcessInfo.threads = get_all_processes((「./ proc /」+ pid_str +「/ task」)。c_str());'' – Zephyr