1

这个类之间有区别吗::

class Osoba{
public:
char* imie;
int wiek;

Osoba(char* imie, int wiek){
    this->imie = imie;
    this->wiek = wiek;
}
};

没有析构函数~Osoba(){delete imie;}还是有它?在这两种情况下都正确吗?

4

3 回答 3

2

有一个重要的区别。

您是char* imie从构造函数中获取的(暗示您没有这样做new),所以您不应该那样delete做。然后不要使用delete *imie;,除非你知道你在做什么。

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

于 2013-05-19T11:16:38.883 回答
1

不同之处在于,在第一种情况下,当一个Osoba人的生命走到尽头时,并没有什么特别的事情发生。在第二种情况下,您调用 delete on imie,这可能是也可能不是正确的做法。

什么是正确的取决于是否Osoba应该拥有对象指针广告imie。如果没有,那么您不需要用户定义的析构函数。如果是这样,那么您需要析构函数,加上赋值运算符和复制构造函数,或者您需要禁用两者。这样做的原因是,如果你不处理赋值和复制,你可能会得到许多指向同一个对象的实例。所有这些实例都将尝试删除同一个对象。见三法则

于 2013-05-19T11:16:50.970 回答
1

不,不要删除imieOsoba因为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 将有一个指向随机内存的指针。

但是要回答您的问题,不,不要删除imieOsoba因为Osoba不知道如何imie创建,除非您决定复制它,在这种情况下,您应该在析构函数中释放副本。

于 2013-05-19T12:30:38.447 回答