【问题标题】:C++ Multiple constructor initialization and destructionC++ 多个构造函数初始化和销毁
【发布时间】:2013-08-13 17:39:43
【问题描述】:

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

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 条件并直接执行删除。

【问题讨论】:

  • 两个构造函数都应该初始化所有数据成员。那么就没有问题了。而且您不必在删除指针之前检查NULL
  • 这听起来像是一个设计问题:这个类有两个不同的契约,一个用int初始化,一个用double初始化。
  • 根据mymap 的内容,您可能无需执行任何操作。此外,删除一个空指针是可以的,根本不会做任何事情。

标签: c++ constructor destructor


【解决方案1】:

首先在构造函数中初始化所有成员变量,否则会导致内存错误。 在mymap 的情况下不需要检查,因为mymap 不是指针,在mypointer 的情况下,首先检查NULL 是正确的

【讨论】:

  • 如果指针尚未初始化,检查NULL 将无济于事;它将有一些不安全的随机值删除。
  • 在空指针上调用delete 是无操作的。所以检查也没有用。
  • 如果我在两个构造函数中都初始化了两个变量,上面的析构函数应该是什么样子?如果我在析构函数中删除 mypointer 和 mymap 的“if 条件”可以吗?
【解决方案2】:

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

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

【讨论】:

  • 如果我在两个构造函数中都初始化了两个变量,上面的析构函数应该是什么样子?如果我在析构函数中删除 mypointer 和 mymap 的“if 条件”可以吗?
  • @AvbAvb 如果映射不包含指针,那么您无需对其执行任何操作,因为映射析构函数将正确破坏其数据。即使是NULL,您也可以随时在指针上执行delete,因此无需检查。
  • 那么我对地图的检查就足够了 --> if(!mymap.empty()),对吧?
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-23
    • 2018-06-30
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多