变量已声明但未初始化:会发生什么?

时间:2016-03-11 12:14:51

标签: c++

定义某个任意类的变量但未初始化时会发生什么?我试图理解编译器在这种情况下尝试了什么(使用默认构造函数?只是分配内存等等)

背景资料:

我最近一直在使用一个库,当声明变量但没有设置时会发生某些事情,例如:

SomeClass x;

这会导致我在自定义类中创建成员变量的问题,其中SomeClass会发生某些事情:

class MyClass {
    SomeClass x;
public:
    MyClass() {
        x = SomeClass("foo", "bar");
    }
};

我不确定为什么,但由于某种原因,只要在MyClass上调用析构函数,代码就会出错。我可以通过使用SomeClass *轻松避免这个问题,但我很好奇当变量以这种方式声明而未设置时实际发生的事情。

2 个答案:

答案 0 :(得分:3)

在您的示例中,首先使用默认构造函数初始化x。然后创建一个新对象并将其分配给变量。

要避免这种双重初始化,您应该在构造函数中使用初始化列表而不是赋值:

class MyClass {
    SomeClass x;
public:
    MyClass() : x("foo", "bar") {}
};

答案 1 :(得分:0)

如果按值声明类变量,例如:

SomeClass x;

然后调用非参数构造函数(在分配内存以存储对象x之后),假设存在一个。如果你没有声明该类的任何构造函数,那么编译器会自动生成非参数构造函数。

如果您的代码在析构函数中崩溃,那么您不会通过将其转换为指针来“修复”它。在这种情况下,您通过new初始化对象,但之后您永远不会调用delete并且永远不会调用析构函数,从而导致内存泄漏。