2017-09-12 2 views
0

ライブラリHDF5を使用してバイナリで保存しています。クラスの静的メンバーとしてH5 :: CompTypeを初期化する

ユーザー定義の「グローバル」データ型を最初から初期化し、必要に応じて使用したいと考えています。

たとえば、 "ベクトル"(コンポーネントが2つの倍精度:x、y)の複合型を定義したいとします。

私は(私は基本的にこの回答から取ったこと:https://stackoverflow.com/a/27088552/4746978)次のようにこのアイデアを実装しようとしたコードをコンパイルしますが、例外がスローされると、私は、実行時に問題を取得

// inside Vector.h 
struct Vector 
{ 
    double x; 
    double y; 
} 


// inside Hdf5types.h 
#include "Vector.h" 
class Hdf5types 
{ 

private: 
    static H5::CompType m_vectorType; 

public: 
    static const H5::CompType& getVectorType(); 

}; 


//inside Hdf5types.cpp 
#include "Hdf5types.h" 
H5::CompType Hdf5types::m_vectorType = Hdf5types::getVectorType(); 

const H5::CompType& Hdf5types::getVectorType() 
{ 
    struct Initializer { 
      Initializer() { 
       m_vectorType = H5::CompType(sizeof(Vector)); 
       m_vectorType.insertMember("x", HOFFSET(Vector, x), H5::PredType::NATIVE_DOUBLE); 
       m_vectorType.insertMember("y", HOFFSET(Vector, y), H5::PredType::NATIVE_DOUBLE); 
      } 
    }; 
    static Initializer ListInitializationGuard; 
    return m_vectorType; 
} 

例外がスローされました:読み取りアクセス違反。

this-> nullptrです。

"this"は、HDF5ライブラリで "IdComponent"と呼ばれるオブジェクトを指します。 私はライブラリーを掘り下げる時間がないので、どのように進むべきかわかりません。おそらく、HDF5を知っている人には解決策があります。

答えて

1

プログラムの起動時に値を割り当てるのが早すぎます。つまり、まだインスタンス化されていないHDF5ライブラリの機能を呼び出す静的割り当てです。だからSIGSEV。あなたは何ができるか

はこれを次のようになります。

// inside Hdf5types.h 
#include <H5Cpp.h> 
#include "Vector.h" 

class Hdf5types{ 

private: 
    static H5::CompType* m_vectorType; 

public: 
    static const H5::CompType& getVectorType(); 

    Hdf5types(); 

}; 

#include "hdf5types.h" 

H5::CompType* Hdf5types::m_vectorType = nullptr; 

Hdf5types::Hdf5types() {} 

const H5::CompType& Hdf5types::getVectorType() { 
    if (m_vectorType == nullptr) { 
    struct Initializer { 
     Initializer() { 
     m_vectorType = new H5::CompType(sizeof(Vector)); 
     m_vectorType->insertMember("x", HOFFSET(Vector, x), H5::PredType::NATIVE_DOUBLE); 
     m_vectorType->insertMember("y", HOFFSET(Vector, y), H5::PredType::NATIVE_DOUBLE); 
     } 
    }; 
    static Initializer ListInitializationGuard; 
    } 
    return *m_vectorType; 
} 

これを遅延m_vectorTypeを初期化します。

+1

ありがとうございます。それが私の問題を解決しました! 割り当てられたメモリを解放する必要があると思いますか?デストラクタでそれを行うのがうまくいけば、私はHdf5オブジェクトを作成していないので、私は確信していません。どう思いますか? – Turms

+0

valgrindは、オブジェクトが解放されていないことを示していません。しかし、間違いなくデストラクタを追加する必要があります。 –

関連する問題