类中是否包含空的destcurator有区别吗
Is there a difference when class contains empty destrcutor or not
这个类之间有区别吗:
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或任何其他分配内存的东西来完成。它甚至可能不是从堆中分配的。
关键是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将有一个指向随机内存的指针。
但为了回答您的问题,不,不要删除Osoba
中的imie
,因为Osoba
不知道imie
是如何创建的,除非您决定复制它,在这种情况下,您应该在析构函数中释放副本。
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 为什么这里的大括号和括号初始化有区别?
- 使用短运算符的字符串连接有区别吗?
- static_cast<unsigned>(签名)与标准::bit_cast<unsigned>(签名)之间有区别吗?
- 在调用函数时,ptr** 和 ptr*& 之间是否有区别,或者首选C++?
- 在类内和类外的定义处执行类转发声明是否有区别
- CRTP:为什么获得嵌套类型和派生类的嵌套方法有区别
- 使用 std::move 将参数传递给函数,如果该参数声明为按值传递或使用移动操作数 &&,是否有区别?
- c++ 类中的静态常量变量和常量变量在存储方面是否有区别
- 为什么 .cpp 文件和 .h 文件之间有区别?
- C++:调用运算符和调用其实现之间有区别吗
- 将全局声明为类声明语句的一部分与使用单独的语句声明全局之间是否有区别
- 用户定义的类和标准类之间有区别吗?
- 这两个数组之间有区别吗?
- 这些在C 中初始化C数组的方式之间有区别吗?
- vector.size()= 0和vector.empty()之间是否有区别
- 显式运算符 = 调用和 = 运算符之间是否有区别
- 这两种初始化成员变量的方法之间有区别吗?
- 忽略内存消耗,使用“int”或“char”是否有区别
- 类中是否包含空的destcurator有区别吗