我有一个包含两个构造函数的类:
A::A(int a) and A::A(double a).
这些构造函数初始化不同的成员变量。在第一种情况下,我初始化一个地图,在第二种情况下,我初始化一个指针。
第一种情况:
A::A(int a): mymap() {}
第二种情况:
A::A(double a) : mypointer(NULL) {}
我的问题是,当创建使用这两个不同构造函数的两个对象时,在调用此类的析构函数时应该考虑什么?我的意思是,按如下方式编写析构函数就足够了: - 我检查mymap是否为空,然后删除条目 - 我检查mypointer是否为null然后删除mypointer。
A::~A(){
if(!mymap.empty()) { delete entries and clear the map}
if(mypointer != NULL) { delete mypointer; mypointer =NULL; }
}
然后,如果我在两个构造函数中初始化两个变量,如:
A :: A(int a):mymap(),mypointer(NULL){} A :: A(双a):mymap(),mypointer(NULL){}
我的析构函数安全吗?或者我应该删除条件并直接删除。
答案 0 :(得分:3)
您需要初始化两个构造函数中的所有成员。
例如,考虑一下在其中一个构造函数中初始化的指针。由于其他构造函数没有初始化它,因此它的值将是未定义的,因此在检查析构函数中的指针时会有未定义的行为。
答案 1 :(得分:0)
首先在构造函数中初始化所有成员变量,否则会导致内存错误。
mymap
无需检查,因为mymap不是指针,如果是mypointer
,则首先检查NULL
是否正确
答案 2 :(得分:0)
我的问题是,当创建使用这两个不同构造函数的两个对象时,在调用此类的析构函数时应该考虑什么?我的意思是足以按如下方式编写析构函数: - 我检查mymap是否为空然后删除条目 - 我检查mypointer是否为null然后删除mypointer。
您的方法在技术上是正确的 - 也就是说,检查并释放析构函数中的所有资源。 但是,从概念上讲,我建议有两个类,因为它看起来至少需要两个 completeley不同的接口和实现。