2010-12-03 21 views
1

ここで自分のコードで何が起こっているのか説明できますか?構造体にデストラクタを正しく使用しているのかどうかはわかりません。そこでのデストラクタで構造体のgslベクトルの割り当て解除

私が取得:
はfunction1:23
機能2:8.86183e-317
*のglibcが検出 ./a:ダブル無料または破損(fasttop):0x000000000111b010 * *

私はちょうどデストラクタをコメントアウトした場合

私が取得:
はfunction1: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

なぜあなたは 'void * 'を使用していますか? –

答えて

1
function1の内部

function2あなたがmain()機能で作成struct1オブジェクトのコピーを作成します。これらのコピーは同じポインタxを持っています。これらのコピーのそれぞれのデストラクタが呼び出されると、同じポインタに3回にそれを呼び出そうので、gsl_vector_freeは、呼び出されます。

sがあるとき sfunction2で一度
  • を破壊されfunction1で一度
    • s

  • を破壊されたときは、コピーコンストラクタを実装する必要があり、このクラスの代入演算子をコピー main
  • 一度破壊されました。リソースを所有するクラスがある場合は、これら2つの関数とデストラクタを実装する必要があります。リソースとは、リソースの使用が終了したときにクリーンアップする必要のあるリソースのことです。

    サンプルコードでは、クラス内のすべての割り当てと割り当て解除をカプセル化して、クラスを気にせずに使用できるようにする方がはるかに優れています。クラスが実際にリソースを管理するようにします。

  • +0

    しかし、構造体(クラス)を初期化するときにベクトルxがどのくらい大きくなるべきかわからない場合はどうすればよいですか?それをサイズ1に割り当ててから、後でそれをどのサイズにするべきか分かったら、それを再割り当てするのは悪い考えですか? – evencoil

    +0

    @evencoil: 'resize()'メンバ関数を提供できますか? –

    +0

    私はそれができない理由がわかりません...私はそれを行う方法を知っていると思う、私はちょうど私がすべきであることを知らなかった。 alloc(1)、alloc(5)とは異なり、alloc(1)、free、alloc(5)の違いは何ですか?過去に私はこれがgsl_vectorsにとって問題であるとは思わなかった....私はあまり経験がありません。 – evencoil

    関連する問題