PDA

Показать полную графическую версию : [c++] Метод push_back класса vector библиотеки STL изменяем константную ссылку


Mad Mouse
17-04-2009, 18:51
Добрый день,

столкнулся с проблемой, происхождение которой решительно не могу понять. Исправить ситуацию вообщем-то несложно, но хотелось бы понять, как такое вообще произошло, потому что в моем понимании такое произойти не может вообще.
Вот фрагмент кода:


//метод пользовательского класа,
//ссылка filename_ создается непосредственно перед вызовом метода,
//никаким образом не привязана к экземпляру класса
int MemoryManager::loadEmptyFile(const char* const filename_) {
//смотрю дебагером значение filename_ - "с:\\testdir1\\serial.ind\0"
//адрес filename_ - :0012F8D0
char* temp=(char*)malloc(100);
strcpy(temp,filename_);
temp=strlwr(temp);
FileInfo newfi; //пустой конструктор
//далее идет большой фрагмент кода, но после того как я его закомментировал,
//ничего не изенилось, так что пишу без него
/*Большой фрагмент кода*/
//в этом месте filename_ - "с:\\testdir1\\serial.ind\0"
//адрес filename_ - :0012F8D0
//Из объявления класса MemoryManager: private: vector<FileInfo> files;
files.push_back(newfi);
//в этом месте filename_ - "\х13"
//адрес filename_ - :0012F8D0 (тот же самый)
return newfi.mmid;
}

Вот собственно и все. До выполнения files.push_back(newfi); значение filename_ было одним, а после выполнения стало другим, при этом переменная filename_ все ещё ссылается на ту же область памяти. Почему изменилось значение, хранимое по адресу, на который указывает filename_? Тем более если учитывать, что этот адрес для метода вроде должен быть const?
Ещё что интерестно, метод push_back объявлен так: void push_back ( const T& x );.
Т.е. и он вроде ничего вообще не должен менять кроме экземпляра самого вектора?

Вообще это dll библиотека, и метод вызывается из функции этой dll библиотеки. Но для тестирования используется простенькая программка, поэтому такая ситуация что переменную изменяет другой поток исполнения вроде бы исключена. Кроме того, ошибка возникает каждый раз.

В чем может быть проблема?

pva
19-04-2009, 22:23
как выглядит struct FileInfo? соделжит ли он указатели на память? ведётся ли потом изменение памяти по этим указателям? (напомню, что при копировании указателей, память, на которые они ссылаются - не копируется, то есть работа идёт с тем же куском памяти)




© OSzone.net 2001-2012