2

を使用して、別のクラスのコンストラクター内のクラスのコンストラクターにいくつかのパラメーターを渡すことは可能mallocですか?私はそれをすることができますnew。私は同じことをする必要がありますmalloc:(意味がない場合は、mallocの代わりにカスタムアロケータを使用していると考えてください)

Class A_Class ... {
       public:
       B_Class *b;
...
     A_Class: ...
      { b = new B_Class (c1, c2, c3);
      } // end of constructor
}

今mallocで:

Class A_Class ... {
       public:
       B_Class *b;
...
     A_Class: ...
      { b = (B_Class*) malloc (sizeof(*b)); 
        ??????????????? }
}
4

4 に答える 4

13

malloc生メモリを割り当てます。コンストラクターを呼び出さないため、コンストラクター引数を渡そうとしても意味がありません。

生メモリを使用する必要がある場合は、「 placement new」構文を使用して、以前に割り当てられた生メモリにオブジェクトを構築する必要があります。

...
void *raw_b = malloc(sizeof *b);
b = new(raw_b) B_Class(c1, c2, c3); // <- placement new 
...

数値的には、 の値はbと同じになります。raw_bつまり、追加のraw_bポインタなしで取得できます。しかし、醜いキャストを避けるために、中間void *ポインターを使用して、この方法で行うことを好みます。

もちろん、そのようなオブジェクトを破壊するときは注意してください。カスタム割り当てには、カスタム削除が必要です。delete一般的なケースだけではできませんb。対称的なカスタム削除シーケンスには、明示的なデストラクタ呼び出しとそれに続く raw メモリの割り当て解除が含まれます。

b->~B_Class(); // <- explicit destructor call
free(b);

PSオブジェクトを作成する必要があるたびにカスタム割り当てを明示的に記述するのではなく、クラスでoperator new/をオーバーロードするという別のルートを検討することもできます。operator delete

于 2012-07-03T15:00:31.280 に答える
2

いいえ、できません。C++ 用に設計されている場合、カスタム アロケーターには、constructこれに使用される関数が呼び出されます (またrebind、別の型を構築できるアロケーターを取得するために使用されます)。

C++03 では、これはコピー構築のみを行うため、呼び出す必要がallocator.construct(ptr, B_Class(c1, c2, c3))あり、クラスはコピー可能でなければなりません。C++11 では、アロケータは任意の引数から構築できます。

アロケータが C 用に設計されている場合、いわゆる「placement new」を使用する必要があります。もちろん、mallocは C 用に設計されています。自分で調べる必要がありますが、構文は次のとおりです。

b = (B_Class*) malloc(sizeof(*b));
new ((void*)b) B_Class(c1,c2,c3);

freeコンストラクターがスローする可能性のある例外とバッファーを処理することを忘れないでください。

于 2012-07-03T14:57:01.423 に答える
0

B を構築するための静的メソッドを作成できます。

class B_Class
{
     public static B_Class* MallocMe(SomeParam param)
     {
           B_Class* retval = (B_Class*) malloc(sizeof(B_Class));
           retval->Construct(param);
           return retval;
     }
 ....
于 2012-07-03T15:01:15.577 に答える
0

mallocコンストラクターを呼び出しません。呼び出されない関数にパラメーターを渡す方法はありません。カスタムアロケーターに関しては、何をしているのかをより具体的にする必要があります。カスタム アロケータを使用して、誰がどこに何を割り当てているか。通常、カスタム アロケーターは割り当てのみに使用されます。彼らはコンストラクターにも関心がありません。

于 2012-07-03T14:55:18.117 に答える