【问题标题】:Is this a mem leak in main? [closed]这是main中的内存泄漏吗? [关闭]
【发布时间】: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;
}

这是内存泄漏吗?如果是,我该如何解决?

提前致谢

【问题讨论】:

    标签: c++ memory


    【解决方案1】:

    这甚至不会编译,因为您使用class 关键字作为变量,因此您不会遇到段错误。

    如果您解决了该问题(可能还有其他几个我认为存在但懒得查找的问题),除非您的构造函数或析构函数存在严重问题,否则我不会期望它出现段错误。

    先编译你的代码,然后我们可以解决任何逻辑错误。

    【讨论】:

    • 这可能是堆栈损坏,但由于它在析构函数上崩溃,他认为它与析构函数有关。
    【解决方案2】:

    除了class不能用作变量名之外,C++中的new操作符会返回一个指向MyClass类型对象的指针。声明应该是:

    MyClass *objectPtr = new MyClass;
    

    如果您随后未能删除它,它仍将存在于内存中,直到程序完成,因此算作泄漏(大概)。

    【讨论】:

    • 最初没有看到那个 - 很好。
    【解决方案3】:

    假设你得到正确的变量名并将其设为MyClass *,是的,这是内存泄漏。因为您通过调用new 获得了内存,但您还没有归还内存。

    解决方法是使用完指针delete

    例如:

    MyClass *c = new MyClass;
    ...
    delete c;
    

    注意,如果你有 newed 一个数组,你需要像这样释放它:

    MyClass *c_arr = new MyClass[10];
    ...
    delete[] c_arr;
    

    【讨论】:

      【解决方案4】:

      要回答这个问题,是的。使用 new 分配而不删除是内存泄漏。然而具有讽刺意味的是,内存泄漏是这段代码 sn-p 最轻微的问题,而且它甚至无关紧要,因为程序在它“泄漏”的那一刻就终止了。

      我假设这是“伪代码”,所以我不会指出编译错误。但是避免伪代码是有帮助的,因为它不允许人们看到你不会包含在 sn-p 中的问题。

      如果delete 导致段错误,我认为这是您真正的问题,那么您的问题可能是除了内存泄漏之外的许多其他问题。内存泄漏通常不会立即导致段错误,它们必须首先耗尽可用的内存池。如果这是您的问题,包含 MyClass 使用的代码可能会有所帮助,尤其是对于析构函数。

      【讨论】:

        猜你喜欢
        • 2011-02-20
        • 2013-08-12
        • 1970-01-01
        • 2013-01-08
        • 2013-11-12
        • 2015-05-04
        • 1970-01-01
        相关资源
        最近更新 更多