Nag*_*ato 1 c++ memory string constructor class
我有这样一段代码:
class temp {
private :
char * name;
public :
temp(char * temp_name){
strcpy(name,temp_name);
cout << "Created"<<name<<endl;
}
~temp(){
cout<< "Destoyed"<<name<<endl;
}
};
int main() {
class temp person1("Jack");
class temp haha("Katy");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我期待有2个单独的类temp实例和不同的名字(Jack和Katy).所有构造函数和析构函数都正常工作.但是,我得到了这样一个奇怪的输出:
CreatedJack
进程以退出代码11完成
我很确定问题是构造函数temp(char*temp_name)中的常量字符串,但无法弄清楚是什么.
所以我的问题是你可以解释一下,就内存而言,常量字符串是如何工作的以及为什么在这种情况下我不能创建2个类temp实例?
您需要分配足够大小的缓冲区来包含传递的字符串数据,并name使用指向此缓冲区的指针进行初始化.现在,您正在取消引用未初始化的指针name获取未定义的行为.
此代码甚至不会编译,因为您试图将字符串文字传递给构造函数,期望指向非const限定的指针char.很可能您使用的Visual Studio在很长一段时间内都允许这种不符合要求的行为.从VS2017开始,您应该编译/permissive-以强制执行一致性.并将构造函数签名更改为
temp(char const * const temp_name)
Run Code Online (Sandbox Code Playgroud)