【发布时间】:2011-09-16 23:46:39
【问题描述】:
这是我的代码,
class MyClass
{
...
};
int main(){
MyClass class = new MyClass;
/*if i do this,
delete class;
i receive a seg fault*/
return 0;
}
这是内存泄漏吗?如果是,我该如何解决?
提前致谢
【问题讨论】:
这是我的代码,
class MyClass
{
...
};
int main(){
MyClass class = new MyClass;
/*if i do this,
delete class;
i receive a seg fault*/
return 0;
}
这是内存泄漏吗?如果是,我该如何解决?
提前致谢
【问题讨论】:
这甚至不会编译,因为您使用class 关键字作为变量,因此您不会遇到段错误。
如果您解决了该问题(可能还有其他几个我认为存在但懒得查找的问题),除非您的构造函数或析构函数存在严重问题,否则我不会期望它出现段错误。
先编译你的代码,然后我们可以解决任何逻辑错误。
【讨论】:
除了class不能用作变量名之外,C++中的new操作符会返回一个指向MyClass类型对象的指针。声明应该是:
MyClass *objectPtr = new MyClass;
如果您随后未能删除它,它仍将存在于内存中,直到程序完成,因此算作泄漏(大概)。
【讨论】:
假设你得到正确的变量名并将其设为MyClass *,是的,这是内存泄漏。因为您通过调用new 获得了内存,但您还没有归还内存。
解决方法是使用完指针delete。
例如:
MyClass *c = new MyClass;
...
delete c;
注意,如果你有 newed 一个数组,你需要像这样释放它:
MyClass *c_arr = new MyClass[10];
...
delete[] c_arr;
【讨论】:
要回答这个问题,是的。使用 new 分配而不删除是内存泄漏。然而具有讽刺意味的是,内存泄漏是这段代码 sn-p 最轻微的问题,而且它甚至无关紧要,因为程序在它“泄漏”的那一刻就终止了。
我假设这是“伪代码”,所以我不会指出编译错误。但是避免伪代码是有帮助的,因为它不允许人们看到你不会包含在 sn-p 中的问题。
如果delete 导致段错误,我认为这是您真正的问题,那么您的问题可能是除了内存泄漏之外的许多其他问题。内存泄漏通常不会立即导致段错误,它们必须首先耗尽可用的内存池。如果这是您的问题,包含 MyClass 使用的代码可能会有所帮助,尤其是对于析构函数。
【讨论】: