类中是否包含空的destcurator有区别吗

Is there a difference when class contains empty destrcutor or not

本文关键字:destcurator 有区别 包含空 是否      更新时间:2023-10-16

这个类之间有区别吗:

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那个。那么,除非你知道自己在做什么,否则不要使用delete *imie;

new指针对delete负责的类/对象,以这种方式组织代码。

不同之处在于,在第一种情况下,当Osoba的生命结束时,不会发生任何特别的事情。在第二种情况下,您在imie上调用delete,这可能是正确的做法,也可能不是正确的做法

什么是正确的取决于Osoba是否应该拥有imie的对象指针ad。如果没有,则不需要用户定义的析构函数。如果是这样,那么您需要析构函数,再加上一个赋值运算符和一个复制构造函数,或者您需要同时禁用这两个运算符。这样做的原因是,如果不将赋值和复制视为大小写,可能会导致许多实例指向同一个对象。所有这些实例都将尝试删除同一个对象。请参阅三条规则。

不,不要删除Osoba中的imie,因为Osoba不知道imie是如何创建的。

一般来说,释放内存是分配内存的人的责任。在您的情况下,调用构造函数Osoba(char* imie, int wiek)的人必须首先创建imie。这可以通过new、malloc、strdup或任何其他分配内存的东西来完成。它甚至可能不是从堆中分配的。

关键是Osobaimie一无所知,所以可能不应该删除它。无论谁分配了imie,都应该将其删除。

事实上,Osoba可能应该复制字符串,即

this->imie = strdup(imie)

在这种情况下,应该在析构函数中使用free(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是如何创建的,除非您决定复制它,在这种情况下,您应该在析构函数中释放副本。