你能解释我的代码在这里发生了什么吗?我不确定我是否在结构中正确使用析构函数。
在那里使用析构函数,我得到:
功能1:23
功能2:8.86183e-317
* glibc检测到 ./a:双重免费或损坏(fasttop):0x000000000111b010 * *
如果我只是注释掉析构函数我得到:
功能1:23
功能2: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;
}
答案 0 :(得分:1)
在function1
和function2
内,您复制了struct1
函数中创建的main()
对象。这些副本具有相同的指针x
。当调用每个副本的析构函数时,会调用gsl_vector_free
,因此您尝试在同一个指针上调用它三次:
function1
被销毁时,s
当function2
被销毁s
当main
被销毁s
您需要为此类实现复制构造函数和复制赋值运算符。每当你拥有一个拥有资源的类时,你需要实现这两个函数和一个析构函数。资源是完成使用后需要清理的任何内容。
在您的示例代码中,将类中的所有分配和释放封装在一起会更好,这样您就可以使用该类而不必担心它。让班级实际管理其资源。