【问题标题】:How do constant strings work in C++常量字符串如何在 C++ 中工作
【发布时间】:2018-04-23 12:09:08
【问题描述】:

我有这么一段代码:

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 个独立的类 temp 实例,它们的名称不同(Jack 和 Katy)。所有构造函数和析构函数都可以正常工作。 但是,我得到了这样一个奇怪的输出:

创建杰克

进程以退出代码 11 结束

我很确定问题出在构造函数 temp(char * temp_name) 中的常量字符串,但不知道是什么。

所以我的问题是你能解释一下,就内存而言,这个常量字符串是如何工作的,为什么在这种情况下我不能创建 2 个类 temp 实例?

【问题讨论】:

  • 您的示例中没有常量字符串。这是一个常量字符串:const std::string s = "Hello World!";.
  • 这一行:strcpy(name,temp_name); 尝试将 c 字符串复制到不存在的缓冲区。这是未定义的行为。复制前需要为name分配空间。
  • 请同时升级您的编译器和标志。这个does not and should not compile as-is.
  • 你在哪里倾向于语法“class temp haha​​”——因为那是非常 C

标签: c++ string class memory constructor


【解决方案1】:

您需要分配足够大的缓冲区以包含传递的字符串数据,并使用指向此缓冲区的指针初始化name。现在你正在取消引用未初始化的指针name 得到未定义的行为。

此外,此代码甚至无法编译,因为您试图将字符串文字传递给构造函数,并期望指向非 const 限定 char 的指针。很可能您使用的 Visual Studio 在很长一段时间内都允许这种不合规行为。从 VS2017 开始,您应该使用 /permissive- 进行编译以强制一致性。并将构造函数签名更改为

temp(char const * const temp_name)

【讨论】:

    猜你喜欢
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 2011-11-26
    • 2016-12-05
    相关资源
    最近更新 更多