这个类之间有区别吗::
class Osoba{
public:
char* imie;
int wiek;
Osoba(char* imie, int wiek){
this->imie = imie;
this->wiek = wiek;
}
};
没有析构函数~Osoba(){delete imie;}
还是有它?在这两种情况下都正确吗?
这个类之间有区别吗::
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
人的生命走到尽头时,并没有什么特别的事情发生。在第二种情况下,您调用 delete on imie
,这可能是也可能不是正确的做法。
什么是正确的取决于是否Osoba
应该拥有对象指针广告imie
。如果没有,那么您不需要用户定义的析构函数。如果是这样,那么您需要析构函数,加上赋值运算符和复制构造函数,或者您需要禁用两者。这样做的原因是,如果你不处理赋值和复制,你可能会得到许多指向同一个对象的实例。所有这些实例都将尝试删除同一个对象。见三法则。
不,不要删除imie
,Osoba
因为Osoba
不知道是如何imie
创建的。
一般来说,释放内存是分配它的人的责任。在您的情况下,调用构造函数的人Osoba(char* imie, int wiek)
必须先创建imie
。这可以通过 new、malloc、strdup 或任何其他分配内存的东西来完成。它甚至可能不是从堆中分配的东西。
关键是它Osoba
不知道任何关于imie
,所以它可能不应该删除它。分配的人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 将有一个指向随机内存的指针。
但是要回答您的问题,不,不要删除imie
,Osoba
因为Osoba
不知道如何imie
创建,除非您决定复制它,在这种情况下,您应该在析构函数中释放副本。