c++ - 常量字符串如何在 C++ 中工作

标签 c++ string class memory constructor

我有这么一段代码:

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/

相关文章:

C++ 堆损坏和 valgrind

c++ - 如何控制像CAD程序一样的3D应用视点?

c++ - 如何打印double变量中包含的正确位数?

javascript - 一个 JavaScript 字符串有多少字节?

Java:使用其他类的方法

C++在尝试覆盖方法时无法实例化抽象类

python - python 中,函数可以在不使用全局的情况下访问类的实例吗?

c++ - 如何在 C++ 中查找和避免未初始化的原始成员?

python - 在python中快速修改字符串

java - 当 String 是有效的 char 时将 String 转换为 char