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

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

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

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

Цель приведенного ниже кода — создать строку со значением имя_базовой_папки. Этот процесс должен сохранить значение имя_базовой_папки постоянная; однако, это необъяснимо меняется.

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());

0

Решение

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

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

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]