none
怎么在子程序里return 完了释放内存? RRS feed

  • 问题

  • 这是我的原代码

    class MEM{
    public:
    float** GEN(void)
    {
    float** X=(float**)malloc(sizeof(float)*3);
    for (int Row=0; Row<3; Row++)
    {
    X[Row]=(float*)malloc(sizeof(float)*3);
    for (int Col=0; Col<3; Col++)
    {
    X[Row][Col]=(float) rand();
    }
    }
    return X;
    free(X);
    }

    };

    int main()

    MEM test;
    for (int NT=0; NT<100; NT++)
    {
    test.GEN();
    }
    return 0;


    假如GEN的是一个很大的矩阵,或者NT要做很多次,内存会一直累积着,导致系统崩溃,请您帮我下,谢谢

    Thank you very much! Email: lshangxin2@student.cityu.edu.hk
    2009年8月12日 16:47

答案

  • 你其实是内存泄露了,free只能释放一层内存。
    你应该这样释放
    for (int Row=0; Row<3; Row++){free(X[Row])}free(X);
    return 后面的代码都是不执行的,你需要把它放到return前面或者test.GEN后面


    0xBAADF00D
    2009年8月12日 18:16
    版主
  • 可以像CString那样做引用计数

    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 Tim Li 2009年8月20日 9:21
    2009年8月12日 19:23
    版主
  • return之后的free没用,你要用变量来存test.GEN()的返回值,并且转换成所对应的结构后进行free,像Vonger说的一样全部释放完.
    just learn
    • 已标记为答案 Tim Li 2009年8月20日 9:21
    2009年8月14日 2:49
  • 用一个智能指针将这个矩阵封装一下就可以了!
    • 已标记为答案 Tim Li 2009年8月20日 9:21
    2009年8月18日 8:08
  • MEM test;
    for (int NT=0; NT<100; NT++)
    {
        float** ptr = test.GEN();
        // do something
        test.Free(ptr);
    }

    Free函数里边按照Vonger说的那样释放内存
    • 已标记为答案 Tim Li 2009年8月20日 9:21
    2009年8月18日 8:17
  • 还有个办法,用vector<vector>替换二维数组:)
    • 已标记为答案 Tim Li 2009年8月20日 9:21
    2009年8月18日 8:21

全部回复

  • 你其实是内存泄露了,free只能释放一层内存。
    你应该这样释放
    for (int Row=0; Row<3; Row++){free(X[Row])}free(X);
    return 后面的代码都是不执行的,你需要把它放到return前面或者test.GEN后面


    0xBAADF00D
    2009年8月12日 18:16
    版主
  • 可以像CString那样做引用计数

    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 Tim Li 2009年8月20日 9:21
    2009年8月12日 19:23
    版主
  • return之后的free没用,你要用变量来存test.GEN()的返回值,并且转换成所对应的结构后进行free,像Vonger说的一样全部释放完.
    just learn
    • 已标记为答案 Tim Li 2009年8月20日 9:21
    2009年8月14日 2:49
  • 用一个智能指针将这个矩阵封装一下就可以了!
    • 已标记为答案 Tim Li 2009年8月20日 9:21
    2009年8月18日 8:08
  • MEM test;
    for (int NT=0; NT<100; NT++)
    {
        float** ptr = test.GEN();
        // do something
        test.Free(ptr);
    }

    Free函数里边按照Vonger说的那样释放内存
    • 已标记为答案 Tim Li 2009年8月20日 9:21
    2009年8月18日 8:17
  • 还有个办法,用vector<vector>替换二维数组:)
    • 已标记为答案 Tim Li 2009年8月20日 9:21
    2009年8月18日 8:21