如果我的课程看起来像这样:
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值或其他基本数据类型做任何事情?
谢谢, 乔纳森
答案 0 :(得分:18)
没有。
但不仅仅是基本类型。对于您未使用new
分配的任何内容,您无需致电delete
。 即使是指针。
delete
(以某种方式)与成员变量类型无关。重要的是,如果您在构造函数(或类方法中的其他位置)中分配(使用new
)。
经验法则是
Have as many delete as new
Have as many delete[] as new[].
当然有时你必须delete
你没有分配的东西,但是如果它不再需要则指向它(由其他人分配,但你是唯一使用它的人)。
当然,有时您必须 delete
已分配但有其他人指向的内容(由您分配但是其他人正在使用它)。
答案 1 :(得分:5)
不,您不必手动删除自动变量。只有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;
}
答案 2 :(得分:3)
不,你没有。您只能delete
使用new
分配的内容。
答案 3 :(得分:3)
您永远不会删除或删除任何属于您对象的内容。该句子立即表明你为什么不对int做任何特定的事情,但是你为指针做了一些事情。
int本身是你班级的一部分。指针是您班级的一部分。事实上,你班上列出的所有东西都是你班级的一部分。需要注意的是,指针是类的一部分,但指针或指向对象不是。这样的指针将被销毁(并且如果相关则调用它的析构函数),但是指针不会。
答案 4 :(得分:2)
没有。 someInt
按值存储,并使用自动存储持续时间。一旦它所属的对象被销毁someInt
,所有其他具有自动存储持续时间的成员变量也将被销毁。您仍然负责管理具有您已经完成的动态存储持续时间(新/删除)的对象。
答案 5 :(得分:1)
您只需删除新内容或删除[]新内容[]。您可能需要查看auto_ptr