【发布时间】:2013-12-04 02:10:43
【问题描述】:
我有一个提取运算符用于具有 char* 成员“名称”的类。这是我的主要驱动程序的代码:
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;
}
字符串复制正文:
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];
}
排除不相关的数据成员,这里是Player定义:
class Player{
public:
char* name;
};
【问题讨论】:
-
向我们展示您的 stringCopy 函数的代码。如果您仍然使用 C++,您可能应该使用 std::string。
-
您为什么说
stringCopy进行“深度”复制?name也是一个对象吗?请发帖stringCopy和Player。 -
那么,真的有问题吗?如果动态内存分配给现在空闲但曾经分配过的内存位置,则无需担心。
-
'name' 的声明只是
char* name -
向我们展示
Player的构造函数。例如,看到name没有初始化并且正在从堆栈中拾取垃圾,我不会感到惊讶。