我一直在研究,没有任何相关内容,所以我来到这里。
我正在努力避免内存泄漏,所以我想知道:
说我有成员MyClass
s int
和a
以及b
的成绩int array c
,其中填写了成员函数:
class MyClass
{
public:
int a, b;
int c[2];
void setVariables()
{
a, b = 0;
for (int i = 0; i < 2; i++)
{
c[i] = 3;
}
}
};
int main(int argc, char* argv[])
{
MyClass* mc = new MyClass();
mc->setVariables();
delete mc;
}
现在,在我致电delete mc
后,a
,b
还会删除c
的所有内容吗?或者我是否必须在MyClass
的析构函数中明确地执行此操作?
答案 0 :(得分:32)
规则非常简单:用new
创建的每个对象必须使用delete
完全销毁一次;使用new[]
创建的每个数组必须使用delete[]
完全销毁一次;其他一切都不能删除。所以你的代码是正确的;您在使用mc
创建new
之后删除new
,而不是删除未使用new
创建的成员。
当程序流程变得复杂时(特别是涉及异常时),应用规则可能非常棘手;因此,最好不要自己删除对象,而是立即使用{{1}}的结果初始化智能指针来为您管理对象。
答案 1 :(得分:29)
执行delete mc
时,编译器调用对象的析构函数(MyClass::~MyClass()
),然后释放与之关联的内存。
默认的析构函数(当你没有声明自己的时候)按顺序调用所有成员变量的析构函数,从最后到第一个通过声明(即在这种情况下,c
,然后{{1然后b
)。由于此示例中的成员是POD types(他们没有析构函数),因此无法完成任务。
答案 2 :(得分:6)
类成员是类的内存结构的一部分。
所以当你释放那段记忆时,成员就会被释放。
注意:
如果你有指针它们也会被破坏,但它们指向的内存不会被破坏。
有关课程内存消耗的更多信息:
<强> C++ Classes 强>
答案 3 :(得分:4)
类中的变量具有类范围,并在类时被销毁。您唯一需要担心的是指针 - 需要在析构函数中正确解决这些问题。
答案 4 :(得分:4)
对于您的具体示例,答案是肯定的。那是因为你在堆栈上分配了成员变量。如果您使用new
为成员变量分配内存,则答案为no,并且需要您显式删除类'析构函数中的成员变量。
class MyClass(): heapVariabl(NULL)
{
MyClass()
{}
~MyClass()
{
delete heapVariable;
}
int a, b;
int[2] c;
int *heapVariable;
void setVariables()
{
a, b = 0;
heapVariable = new int; // <- requires deletion in destructor to free memory
*heapVariable = 0;
for (int i = 0; i < 2; i++)
{
c[i] = 3;
}
}
}
答案 5 :(得分:3)
释放对象时,其所有成员变量也会自动释放。因此,在您的情况下,是的,a
,b
和c
都已被释放。
但是,如果你的一个成员变量是一个指针,只有指针本身被自动释放,不它指向的对象 - 这是必须编写自己的析构函数的最常见情况
答案 6 :(得分:1)
delete
将回收对象包含的内存。如果你的类型保持指向动态分配内存的指针,那么你需要在析构函数内部清理它们。
至于你的具体问题:
在我调用delete mc之后,将删除a,b和c的所有内容吗?或者我是否必须在MyClass的析构函数中明确地执行此操作?
它们将被清理,因为它们没有动态分配。
答案 7 :(得分:1)
您的三个变量未分配new
,因此根本不需要删除它们。
当你的班级为delete
d时(当你的班级为new
d时分配它们),将 ,但这与被删除的不同。