[英]Do I need to delete basic data types in a destructor? C++
如果我有一个看起来像这样的类:
class SomeClass {
public:
SomeClass(int size) {
arr = new int[size];
someInt = size / 10;
};
~SomeClass() {
delete [] arr;
//do I need to somehow delete the int value 'someInt'?
};
private:
int *arr; //pointer to dynamically allocated array
int someInt;
}
究竟应该包含在析构函数中以避免内存泄漏?
我知道我需要删除数组,因为它是动态分配的,但我是否需要对int值或其他基本数据类型做任何事情?
谢谢,乔纳森
没有。
但不只是基本类型。 对于您未使用new
分配的任何内容,您无需调用delete
。 即使是指针 。
delete
( 以某种方式 )与成员变量类型无关。 重要的是,如果您在构造函数( 或类方法中的其他位置 )中分配了它(使用new
)。
经验法则是
Have as many delete as new
Have as many delete[] as new[].
当然,有时您将不得不delete
尚未分配的东西,但如果不再需要则指向它( 由其他人分配,但您是唯一使用它的人 )。
当然,有时你必须不 delete
您已经分配但别人指向( 由你分配的,但其他人在使用它 )的东西。
不,您不必手动删除自动变量。 只delete
你的new
。
此外,您可以通过智能指针使用RAII来避免删除阵列。 然后,您不必手动定义析构函数; 自动定义的析构函数将满足您的需求。
class SomeClass {
public:
SomeClass(int size)
: arr {new int[size]}
, someInt = size/10;
{};
private:
std::unique_ptr<int[]> arr; //pointer to dynamically allocated array
int someInt;
}
使用更专业的类型(如std::vector
而不是通用智能指针更好:
class SomeClass {
public:
SomeClass(int size)
: arr (size)
, someInt = size/10;
{};
private:
std::vector<int> arr;
int someInt;
}
不,你没有。 您只delete
使用new
分配的内容。
您永远不会删除或删除任何属于您对象的内容。 那句话立即表明你为什么不对int做任何特定的事情,但是你为指针做了一些事情。
int本身是你班级的一部分。 指针是您班级的一部分。 事实上,你班上列出的所有东西都是你班级的一部分。 需要注意的是, 指针是类的一部分,但指针对象或指向对象不是。 这样的指针将被销毁(并且如果相关则调用其析构函数),但是指针不会。
不, someInt
按值存储并使用自动存储持续时间 。 一旦它所属的对象被销毁, someInt
和具有自动存储持续时间的所有其他成员变量也被销毁。 您仍然负责管理具有您已经完成的动态存储持续时间(新/删除)的对象。
您只需删除新内容或删除[]新内容[]。 您可能想要查看auto_ptr
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.