2012-04-20 31 views
0

コンテキストから始めます - 私はメモリ管理サブシステムを作成していますので、新しい[] /削除[]演算子。私が解決しなければならなかった問題の1つは、new []によって割り当てられた配列のサイズを格納する方法でした。delete []はデストラクタを解放されたオブジェクトで呼び出すことができます。私の選択した解決策は、実際の配列の最初の要素の前に、より多くのメモリを割り当てて配列のサイズを格納し、その要素へのポインタを返すことでした。私は次のコードを思いついた:構造体のメンバ変数への(通常の)ポインタを構造体全体へのポインタに変換する

template<typename T, typename AllocatorType> 
T* NewArrayHelper(size_t count, AllocatorType* allocator, const char* file, int line) { 
    // Helper struct 
    struct Helper { 
     size_t Count; 
     T Array[1]; 
    }; 

    Helper* ptr = allocator->Allocate(sizeof(Helper) + sizeof(T)*(count-1), ALIGNOF(Helper), file, line); 

    // Call constructors, etc. ... 

    return &ptr->Array[0]; 
} 

私は私がこのアプローチについては好きではアレイとsize_tのための右のアライメントアウトコンパイラの数字ということであることを言及すべきであると私は読書を除いて何もする必要はありませんそれをアロケータに渡します(ALIGNOFはそれを行うマクロです)。また、キャスト・スルー・ユニオンや、エイリアシングなどの問題があるchar * hacksにキャストする必要はありません。

ここで、delete []演算子の代わりに問題があります。つまり、その構造体の内部構造体へのポインタが渡されます。私は少なくともハッキングを行い、おそらく、ポータブルな方法で全体の構造体へのポインタへのポインタなどを変換することができますどのよう

template<typename T, typename AllocatorType> 
void DeleteArrayHelper(T* ptr, AllocatorType* allocator, const char* file, int line) { 
    // Helper struct 
    struct Helper { 
     size_t Count; 
     T Array[1]; 
    }; 

    // Here ptr points to Array[0] in Helper struct 
} 

?このような

答えて

0

何かが動作する、ポータブルでなければなりません:

Helper *h = (Helper*)((uintptr_t)ptr - offsetof(Helper, Array[0])); 

uintptr_tstdint.hで通常です。

関連する問題