1

你能解释一下我的代码在这里发生了什么吗?我不确定我是否在结构中正确使用了析构函数。

有了析构函数,我得到:
function1: 23
function2: 8.86183e-317
* glibc detected./a:双重释放或损坏(fasttop):0x000000000111b010 * *

如果我只是注释掉我得到的析构函数:
function1: 23
function2: 24

这就是我想要的。但是我不需要析构函数来避免更复杂程序的内存泄漏吗?

(如您所见,我可能对一般的指针/分配有点困惑)

谢谢!

编辑:哦,是的,为什么function1中的额外分配步骤会有所不同?

Edit2:我应该在构造函数中初始化 x = 0 吗?我认为这是正确的......当我这样做时,我应该在初始化时分配它吗?所以改为:x = gsl_vector_alloc(1)。

#include <iostream>
    using namespace std;
#include <cassert>
#include <cmath>
#include <gsl/gsl_vector.h>

struct struct1{
    gsl_vector * x;

    struct1() {
        x = 0;
    }
    ~struct1() {
        if (x) gsl_vector_free(x);
    }
};

void function1(void *p) {
    struct1 s = *(struct1 *) p;
    s.x = gsl_vector_alloc(1);
    gsl_vector_set(s.x, 0, 24);
}

void function2(void *p) {
    struct1 s = *(struct1 *) p;
    gsl_vector_set(s.x, 0, 24);
}

int main() {
    struct1 s;
    s.x = gsl_vector_alloc(1);
    gsl_vector_set(s.x, 0, 23);

    function1(&s);
    cout << "function1: " << gsl_vector_get(s.x, 0) << endl;

    function2(&s);
    cout << "function2: " << gsl_vector_get(s.x, 0) << endl;

    return 0;
}
4

1 回答 1

1

在里面,function1function2复制你在函数struct1中创建的对象。main()这些副本具有相同的指针x。当每个副本的析构函数被调用时,gsl_vector_free就会被调用,所以你尝试在同一个指针上调用它 3 次:

  • 曾经在function1何时s被摧毁
  • 曾经在function2何时s被摧毁
  • 曾经在main何时s被摧毁

您需要为此类实现复制构造函数和复制赋值运算符。任何时候你有一个拥有资源的类,你都需要实现这两个函数和一个析构函数。资源是在您使用完毕后需要清理的任何东西。

在您的示例代码中,最好将所有分配和释放封装在类中,这样您就可以使用该类而不必担心它。让类实际管理它的资源。

于 2010-12-03T18:13:34.650 回答