2016-02-28 50 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