Строковый конструктор константы char* меняет значение константы char*?

Текущий выпуск

Кажется, значение const char* меняется на бессмысленное значение.

Пример ошибочного кода

Целью приведенного ниже кода является создание строки со значением basedir. Этот процесс должен поддерживать значение 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

Переменная 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 ответ

Решение

Похоже, переменная "basedir" уже указывает на память, которой вы больше не владеете. По стечению обстоятельств он все еще содержит значение, которое вы ему присвоили. Выделив память для строки "basedir_str", эта память используется повторно и перезаписывается другими данными. Так что ваша проблема лежит вне функции "get_process".

Как вы распределяете "basedir"?

Другие вопросы по тегам