У меня есть оператор извлечения, который используется для класса с char * member 'name'. Вот мой код из моего главного драйвера:Динамическое выделение с использованием уже используемых ячеек памяти
Player tempPlayer;
for(int i=0;i<4;i++){
fin >> tempPlayer;
}
я затем, чтобы сделать что-то с этим извлеченным игроком (который не имеет отношения), но проблема в том, что каждый раз, когда используются оператор извлечения, что-то странное происходит. Вот определение оператора:
ifstream& operator>>(ifstream& fin, Player& currentPlayer){
char* temp = new char[50];
char tempChar;
fin >> temp;
// importing from a file that contains names of about 6 characters each
stringCopy(currentPlayer.name, temp);
delete[] temp;
temp = NULL;
return fin;
}
stringCopy тело:
void stringCopy(char *destPtr, const char *sourcePtr){
while(*sourcePtr!='\0'){
*destPtr = *sourcePtr;
destPtr++;
sourcePtr++;
}
*destPtr='\0';
}
Я отладка, распечатав адрес памяти, используемый для temp
и имени.
В первый раз, когда вызывается оператор извлечения, имя игрока и массив temp
имеют разные адреса памяти, что и должно произойти. Затем temp удаляется и устанавливается в NULL, который я подтвердил, напечатав адрес (и получив «0»), и адрес имени игрока останется после возвращения функции.
Однако при последующих вызовах адрес temp
И имя игрока становится идентичным адресу имени первого игрока. Адрес имени ДОЛЖЕН быть таким же, как и тот же объект, который только что перезаписывается, но почему temp
получает ТОЛЬКО адрес «имя», если он выделен ключевыми словами new char[]
?
Вот код я использовал при отладке:
Вдоль каждого шага на пути в теле оператора:
cout << "temp address followed by name address: " << (void*)temp << " " << (void*)(currentPlayer.name) << endl;
В главном драйвере:
cout << "player " << i+1 << " has been extracted with name address " << (void*)(tempPlayer.name) << endl;
Вот Player
конструктор:
Player::Player(){
name = new char[50];
stringCopy(name,"name");
ID = new int[5];
}
За исключением несущественных элементов данных, здесь определение игрока:
class Player{
public:
char* name;
};
Показать код для функции stringCopy. Вероятно, вы должны использовать std :: string, если вы все равно используете C++. –
Почему вы говорите, что 'stringCopy' делает« глубокую »копию? Является ли 'name' тоже объектом? Пожалуйста, напишите 'stringCopy' и' Player'. – KeithSmith
Итак, есть ли на самом деле проблема? Если динамическая память распределена на свободную, но однажды выделенную ячейку памяти, нет необходимости беспокоиться. –