2011-01-19 15 views
1

私が取っているクラスでは、割り当てユーティリティを開発する必要があります。割り当てられたアドレスで構造をインスタンス化する(割り当て割り当て)

安全性とは別に、私は遠くのポインタを使っていくつかの構造体に対してアドレスを受け取り、割り当てます。私はこの割り当てで "memalloc"を使用することも許可されていません。

memlocを使用せずにリンクされた構造を作成する方法については、Linked Lists in C without malloc を参照してください。しかし、私はどのように私は特定のアドレスに新しいインスタンスを割り当てることができるかを知る必要があります。たとえば、アドレス0x5000への開始ポインタがある場合、次の構造体を256バイト先に(アドレスの点で)開始するために、増分オフセット(たとえば256としましょう)を使用できるようにリストを作成したいと思います。私の出発点。

この割り当ては、セグメント化とx86アーキテクチャに精通していることに基づいています。

ご協力いただきましてありがとうございます。

答えて

3

あなたが何をしたいのかに応じて、あなたはおそらく次のツールの組み合わせを使用することをお勧めします:

配置新しいを:あなたは、次の構文を使用して、特定のメモリ位置にオブジェクトを構築することができます。

new (reinterpret_cast<void*>(0x500)) MyObject(/* ...ctor args... */); 

これは新しいメモリを割り当てません。代わりに指定されたメモリアドレスをレシーバオブジェクトとして使用してコンストラクタを呼び出します。アラインメントの制限に注意してください!

カスタムアロケータ。std::allocator<T>の行に沿って新しいクラスを定義して、指定した場所にメモリを予約することができます。そして、あなたが望む場所で自動的にメモリを使用するSTLコンテナを作成することができます。

+0

お返事ありがとうございました。 私は何かを明確にする必要があります。私は作成しているもの以外に割り当てユーティリティを使用することはできません。したがって、新しい、削除、無料、等... 私はもっとできるように探しているポインタを作成し、いくつかのアドレスをポイントし、私のポインタによって参照先のポイントアドレスで変数とデータ構造を作成します。 – MHZ

+0

私はさらにこのことを質問に従えます。 住所をデフェンスしてデータ型としてキャストすることは可能ですか? – MHZ

+0

@ user580887-プレースメントnewはメモリ割り当て手法ではありません。それはあなたが説明したことだけを行います。メモリのどこかを指すことができる場合は、新しい場所を使用してその場所にオブジェクトを構築できます。スペースを確保するために標準のフリー・アロケータを呼び出すのではなく、十分なスペースがあることを完全に信頼します。 – templatetypedef

0

私は教授から電子メールを受け取りました。私は「新しい」演算子を使用することはできません。ちょうどあなたが私に言ったもので二重チェックするために、私はこの例を再び尋ねることがあります。その線に沿って

struct example{ 
    int a; 
    struct example *next; 
}; 

void *ptr; 
ptr = 0x5000; 
ptr = &((example)*ptr); 

か何か?

+0

この作業をするには、 'example * ptr =(example *)0x5000;'と書いておきます。結局のところ、あなたが終わりに得ようとしているのは 'example'オブジェクトへのポインタなので、これは' void * 'への変換をバイパスします。 – templatetypedef

+0

ありがとうございました。私が人々を投票する方法を見つけたら、私はそうするでしょう。 – MHZ