Kee*_*elx 25 c++ variables class member delete-operator
我一直在研究,没有任何相关的问题,所以我来到这里.
我试图避免内存泄漏,所以我想知道:
假设我有一个MyClass成员ints 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;
}
Run Code Online (Sandbox Code Playgroud)
现在,我打电话后delete mc,会a,b以及所有的内容c被删除?或者我必须在析构函数中明确地做到这一点MyClass?
Mik*_*our 34
规则很简单:创建的每个对象new必须完全被销毁一次delete; 创建的每个数组都new[]必须完全被销毁一次delete[]; 其他一切都不能删除.所以你的代码是正确的; 您mc在创建后删除new,而不是删除未创建的成员new.
当程序流变得复杂时(特别是涉及异常时),应用规则可能非常棘手; 因此,最好不要自己删除对象,而是立即使用结果new初始化智能指针来为您管理对象.
对于您的具体示例,答案是肯定的。那是因为您在堆栈上分配了成员变量。如果您曾经new为成员变量分配内存,则答案是否定的,并要求您显式删除类的析构函数中的成员变量。
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)