C++ 类是否包含空的析构函数有区别吗
这门课有区别吗C++ 类是否包含空的析构函数有区别吗,c++,destructor,C++,Destructor,这门课有区别吗 class Osoba{ public: char* imie; int wiek; Osoba(char* imie, int wiek){ this->imie = imie; this->wiek = wiek; } }; 不使用析构函数~Osoba(){delete imie;}还是使用它?这两种情况都正确吗?有一个重要的区别 您将从构造函数中获得char*imie(意味着您没有new那个),所以您不应该删除那个。然后不要使用delete*
class Osoba{
public:
char* imie;
int wiek;
Osoba(char* imie, int wiek){
this->imie = imie;
this->wiek = wiek;
}
};
不使用析构函数
~Osoba(){delete imie;}
还是使用它?这两种情况都正确吗?有一个重要的区别
您将从构造函数中获得char*imie
(意味着您没有new
那个),所以您不应该删除那个。然后不要使用delete*imie除非你知道你在做什么
指针负责删除它的类/对象以这种方式组织代码 有一个重要的区别
您将从构造函数中获得char*imie
(意味着您没有new
那个),所以您不应该删除那个。然后不要使用delete*imie除非你知道你在做什么
指针负责删除它的类/对象以这种方式组织代码 不同之处在于,在第一种情况下,Osoba
的生命结束时,没有什么特别的事情发生。在第二种情况下,在imie上调用delete,这可能是正确的,也可能不是正确的
什么是正确的取决于Osoba
是否应该通过imie
拥有对象指针ad。如果没有,则不需要用户定义的析构函数。如果是,那么您需要析构函数,加上赋值运算符和复制构造函数,或者您需要禁用这两个。其原因是,如果不使用case处理赋值和复制,那么最终可能会出现指向同一对象的多个实例。所有这些实例都将尝试删除同一对象。请参阅。区别在于,在第一种情况下,当一个Osoba
的生命结束时,没有什么特别的事情发生。在第二种情况下,在imie上调用delete,这可能是正确的,也可能不是正确的
什么是正确的取决于Osoba
是否应该通过imie
拥有对象指针ad。如果没有,则不需要用户定义的析构函数。如果是,那么您需要析构函数,加上赋值运算符和复制构造函数,或者您需要禁用这两个。其原因是,如果不使用case处理赋值和复制,那么最终可能会出现指向同一对象的多个实例。所有这些实例都将尝试删除同一对象。请参阅。否,不要删除Osoba
中的imie
,因为Osoba
不知道imie
是如何创建的
一般来说,释放内存是分配内存的人的责任。在您的例子中,无论谁调用构造函数Osoba(char*imie,int-wiek)
都必须首先创建imie
。这可以通过new、malloc、strdup或任何其他分配内存的东西来完成。它甚至可能不是从堆中分配的
关键是,Osoba
不知道任何关于imie
的信息,所以它可能不应该删除它。分配imie的人应将其删除
事实上,Osoba
可能应该复制字符串,即
this->imie = strdup(imie)
在这种情况下,您应该在析构函数中释放(imie)
。它应该复制字符串的原因可能是调用方可能执行了以下操作:
Osoba* SomeFunction()
{
char X[100];
sprintf(X, "I will be gone when SomeFunction returns");
return new Osoba(X, 0);
}
在这种情况下,当SomeFunction返回时,X将消失,Osoba将有一个指向随机内存的指针
但是要回答您的问题,不,不要删除Osoba
中的imie
,因为Osoba
不知道imie
是如何创建的,除非您决定复制它,在这种情况下,您应该在析构函数中释放副本。否,不要在Osoba
中删除imie
,因为Osoba
不知道imie
是如何创建的
一般来说,释放内存是分配内存的人的责任。在您的例子中,无论谁调用构造函数Osoba(char*imie,int-wiek)
都必须首先创建imie
。这可以通过new、malloc、strdup或任何其他分配内存的东西来完成。它甚至可能不是从堆中分配的
关键是,Osoba
不知道任何关于imie
的信息,所以它可能不应该删除它。分配imie的人应将其删除
事实上,Osoba
可能应该复制字符串,即
this->imie = strdup(imie)
在这种情况下,您应该在析构函数中释放(imie)
。它应该复制字符串的原因可能是调用方可能执行了以下操作:
Osoba* SomeFunction()
{
char X[100];
sprintf(X, "I will be gone when SomeFunction returns");
return new Osoba(X, 0);
}
在这种情况下,当SomeFunction返回时,X将消失,Osoba将有一个指向随机内存的指针
但要回答您的问题,请不要删除Osoba
中的imie
,因为Osoba
不知道imie
是如何创建的,除非您决定复制它,在这种情况下,您应该在析构函数中释放副本。如果您对imie
使用动态内存分配,那么编写析构函数是显式地为范围外对象释放内存的好选择,您不必注意删除imie
,它可以在析构函数中调用,阅读这取决于。Osobo
是否拥有作为imie
传入的指针。如果它不拥有该资源,则不应将其删除。如果它确实拥有它,那么您希望在析构函数中清理它。使用析构函数,并且不删除复制构造函数,这将是完全不正确的。如果您对imie
使用动态内存分配,那么编写析构函数是显式释放超出范围对象的内存的好选择,您不必注意删除imie
,它可以在析构函数中调用,这取决于您的阅读。D