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