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()),对吗?。