我有这么一段代码:
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;
}
我期望有 2 个具有不同名称(Jack 和 Katy)的类 temp 的独立实例。所有构造函数和析构函数都运行良好。 然而,我得到了这样一个奇怪的输出:
CreatedJack
Process finished with exit code 11
我很确定问题出在构造函数 temp(char * temp_name) 中的常量字符串,但无法弄清楚是什么。
所以我的问题是,您能否解释一下,就内存而言,常量字符串是如何工作的,以及为什么在这种情况下我不能创建类 temp 的 2 个实例?
最佳答案
您需要分配足够大小的缓冲区以包含传递的字符串数据,并使用指向该缓冲区的指针初始化name
。现在你正在取消引用未初始化的指针 name
得到未定义的行为。
此外,此代码甚至无法编译,因为您正试图将字符串文字传递到构造函数中,期望指向非 const 限定 char
的指针。很可能您使用的 Visual Studio 在很长一段时间内都允许这种不符合规范的行为。从 VS2017 开始,您应该使用 /permissive-
进行编译以强制执行一致性。并将构造函数签名更改为
temp(char const * const temp_name)
关于c++ - 常量字符串如何在 C++ 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49980742/