定义某个任意类的变量但未初始化时会发生什么?我试图理解编译器在这种情况下尝试了什么(使用默认构造函数?只是分配内存等等)
背景资料:
我最近一直在使用一个库,当声明变量但没有设置时会发生某些事情,例如:
SomeClass x;
这会导致我在自定义类中创建成员变量的问题,其中SomeClass
会发生某些事情:
class MyClass {
SomeClass x;
public:
MyClass() {
x = SomeClass("foo", "bar");
}
};
我不确定为什么,但由于某种原因,只要在MyClass
上调用析构函数,代码就会出错。我可以通过使用SomeClass *
轻松避免这个问题,但我很好奇当变量以这种方式声明而未设置时实际发生的事情。
答案 0 :(得分:3)
在您的示例中,首先使用默认构造函数初始化x。然后创建一个新对象并将其分配给变量。
要避免这种双重初始化,您应该在构造函数中使用初始化列表而不是赋值:
class MyClass {
SomeClass x;
public:
MyClass() : x("foo", "bar") {}
};
答案 1 :(得分:0)
如果按值声明类变量,例如:
SomeClass x;
然后调用非参数构造函数(在分配内存以存储对象x
之后),假设存在一个。如果你没有声明该类的任何构造函数,那么编译器会自动生成非参数构造函数。
如果您的代码在析构函数中崩溃,那么您不会通过将其转换为指针来“修复”它。在这种情况下,您通过new
初始化对象,但之后您永远不会调用delete
并且永远不会调用析构函数,从而导致内存泄漏。