Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;多构造函数初始化和销毁_C++_Constructor_Destructor - Fatal编程技术网

C++ C++;多构造函数初始化和销毁

C++ C++;多构造函数初始化和销毁,c++,constructor,destructor,C++,Constructor,Destructor,我有一个包含两个构造函数的类: A::A(int a) and A::A(double a). 这些构造函数初始化不同的成员变量。在第一种情况下,我初始化一个映射,在第二种情况下,我初始化一个指针 第一种情况: A::A(int a): mymap() {} 第二种情况: A::A(double a) : mypointer(NULL) {} 我的问题是,当两个对象使用这两个不同的构造函数时,当调用这个类的析构函数时,我应该考虑什么?我的意思是,按照如下方式编写析构函数是否足够: -

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

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(inta):mymap(),mypointer(NULL){} A::A(双A):mymap(),mypointer(NULL){}


我的销毁程序安全吗?或者我应该删除if条件并直接执行删除。

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

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

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

A::~A(){
  if(!mymap.empty()) { delete entries and clear the map}

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

两个构造函数都应该初始化所有数据成员。那就没问题了。在删除指针之前,您不必检查
NULL
。这听起来像是一个设计问题:该类有两个不同的契约,一个是用
int
初始化的,另一个是用
double
初始化的。根据
mymap
的内容,您可能无需执行任何操作。此外,删除空指针是可以的,而且根本不起任何作用。如果指针尚未初始化,检查
null
将没有帮助;它会有一些随机值,不能安全地删除。对空指针调用
delete
是不可行的。因此,这无助于检查。如果我在两个构造函数中初始化这两个变量,上面的析构函数应该是什么样的?如果我在析构函数中删除mypointer和mymap的“if条件”可以吗?如果我在两个构造函数中都初始化了这两个变量,那么上面的析构函数应该是什么样子?如果我在析构函数中删除mypointer和mymap的“如果条件”可以吗?@AvbAvb如果映射不包含指针,那么您就不需要做任何事情,因为映射析构函数将正确地析构函数其数据。即使指针为
NULL
,也可以对其执行
delete
,因此无需进行检查。因此,我对映射的检查就足够了-->如果(!mymap.empty()),对吗?。