2

我有一个有两个构造函数的类:

A::A(int a) and A::A(double a). 

这些构造函数初始化不同的成员变量。在第一种情况下,我初始化了一个地图,在第二种情况下,我初始化了一个指针。

第一种情况:

 A::A(int a): mymap() {}

第二种情况:

A::A(double a) : mypointer(NULL) {} 

我的问题是,当创建使用这两个不同构造函数的两个对象时,调用这个类的析构函数时应该考虑什么?我的意思是按如下方式编写析构函数就足够了: - 我检查 mymap 是否不为空然后删除条目 - 我检查 mypointer 是否不为空然后删除 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(double a): mymap(), mypointer(NULL) {}

我的析构函数安全吗?或者我应该删除 if 条件并直接执行删除。

4

3 回答 3

3

您需要初始化两个构造函数中的所有成员。

例如,考虑您在其中一个构造函数中初始化的指针。由于其他构造函数没有对其进行初始化,因此它的值将是未定义的,因此在检查析构函数中的指针时,您会遇到未定义的行为。

于 2013-08-12T12:08:16.300 回答
0

首先在构造函数中初始化所有成员变量,否则会导致内存错误。如果mymapmymap 不是指针并且如果mypointer首先检查是正确的,则无需检查NULL

于 2013-08-12T12:07:53.000 回答
0

我的问题是,当创建使用这两个不同构造函数的两个对象时,调用这个类的析构函数时应该考虑什么?我的意思是按如下方式编写析构函数就足够了: - 我检查 mymap 是否不为空然后删除条目 - 我检查 mypointer 是否不为空然后删除 mypointer。

您的方法在技术上是正确的 - 即检查并释放析构函数中的所有资源。但是,从概念上讲,我建议有两个类,因为看起来您至少需要两个完全不同的接口和实现。

于 2013-08-12T12:16:09.513 回答