【问题标题】:Dynamic variable doesnt work动态变量不起作用
【发布时间】:2018-12-28 03:31:33
【问题描述】:

在这段代码中,当我动态初始化它时,为什么 first("invNummer") 总是为 0?当我将其作为静态(两个)进行时,它可以工作。

class Computer {
private:
    int invNummer;
    char* osName;
    int state; // 0 – aus, 1 - an
public:
    Computer(int INV, char* OS, int st);

    void info() {
        cout << invNummer << " " << osName << " " << state << endl;
    }
};

Computer::Computer(int INV, char* OS, int st)
    : invNummer(INV)
    , osName(OS)
    , state(st)
{};

int main()
{
    Computer* one;
    one = new Computer(10, (char*)"Windows", 1);
    delete one;
    Computer two(9, (char*)"Linux", 0);

    one->info();
    two.info();

    return 0;
}

输出如下所示:

0 Windows 1
9 Linux 0

【问题讨论】:

  • 请不要这样做(char *)"Windows"。使用const char* 或使用std::string/std::string_view
  • 请确保您的代码在语言翻译中仍然存在,C++ 不知道einsone。您的主要问题是您删除了 one 指向的对象,该对象使指针悬空,取消引用悬空指针会调用 ub。此外,您不应该转换字符串文字,它们是 const,因为它们存在于只读内存中。
  • @NathanOliver 我认为这不会有什么不同,但没关系。但是动态变量的问题依然存在。
  • 请了解动态分配。您无法通过反复试验来解决这些问题。
  • 您发布的代码中没有进行静态分配。

标签: c++ class c++11 dynamic constructor


【解决方案1】:

作为@It's_comming_home pointed out 对您而言,您的问题与动态创建one 对象无关,而是与删除该对象有关:

delete one;

当您删除one 对象时,指针悬空,即不再可用。如果您之后尝试取消引用它:

one->info();

你会得到未定义的行为,就像你的输出显示的那样。

要解决此问题,只需在调用 one 方法后删除 one 对象即可:

one->info();
two.info();

delete one;

【讨论】:

  • 我也想这么说,但是问题解决了,谢谢
猜你喜欢
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 2014-08-12
  • 2020-02-09
  • 1970-01-01
相关资源
最近更新 更多