Можете ли вы объяснить, что происходит с моим кодом здесь?Я не уверен, правильно ли я использую деструктор в структуре.
С деструктором там я получаю:
function1: 23
function2: 8.86183e-317
* Обнаружен glibc ./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;
}