-2

基本クラス A、A から派生したクラス B があります。ここで、クラス B は配置 new 演算子を使用して割り当てられます。コードの一部として、クラス A 内にクラス C を追加しました

現在、配置 new は sizeof クラス B の malloc を使用するだけで、クラス C は考慮されていません。クラス C コンストラクターは、クラス B コンストラクター内で呼び出されます。(これは私の容疑者です)

それが正しいかどうか知りたいです。それとも、配置の新しい割り当てにクラス C のサイズを追加しますか? メモリを追加する場合、クラス C のコンストラクタをどのように呼び出すと、メモリが再度割り当てられるのでしょうか。

card.h {
class Card
{
private:
    char           hwModel; // HW/FW model and rev are stored in the
                            // database to detect change of card type
    char           hwRev;
    char           serialNum[EM_CARD_SERIAL_NUM_SIZE];
    char           fwModel;
    char           fwRev;
>>>>
    public:

     class IssuResource *ptrIssuResrc; 

    void *operator new(size_t size, void *objP) {size = size; return objP;};
            // overload the new operator

    void operator delete(void *objP) { objP = objP;};
            // overload the delete operator
    Card();
}


chopperCard.cpp
 // Allocate Memory and Create Card Object
     /* sa_ignore */
    buf = (UINT32 *)malloc(sizeof(CardChop));
    if (buf == NULL) {
        emLogError(EM_INTERNAL_ERROR, __FUNCTION__,
            "exit: failed to allocate %d bytes for card object\n",
            sizeof(CardChop)
        );
        exit(1);
    }

    /* sa_ignore */
    card = new (buf) CardChop(spa_issu_restart);  --> placement new 
}

Constructor for choppercard:
{
  CardChop::CardChop (boolean is_issu_set) : Card()
{
    issu_inprogress = is_issu_set;
    if (is_issu_set) {
        ISSUTRACE(4,"Issu state is SET\n");
        dev_np37xx_update_issu_state(is_issu_set);
        dev_set_issu_state(is_issu_set);
        dev_dm_issu_state(is_issu_set);
        dev_tigris_issu_state(is_issu_set);
        dev_evros_issu_state(is_issu_set);
        dev_evros1_issu_state(is_issu_set);
 >>>
     vtwin->fvt->set_gp_stat(vtwin, VTWIN_GP_STAT_APP_TRACE1,
                            CHOP_BG_INIT_FAIL);

    // init Bourget device
    initDevice((dev_object_t *)bourget);
    vtwin->fvt->set_gp_stat(vtwin, VTWIN_GP_STAT_APP_TRACE1, CHOP_BG_INIT_AFTER);
    ptrIssuResrc = new IssuResource();
}
4

2 に答える 2

1

Placement new はoperator new、ヒープから割り当てるのではなく、指定されたアドレスを使用することを除いて、placement なしと同じように機能します。どちらのフォームoperator new自体も実際のコンストラクターを呼び出さないため、構築はどちらの方法でもまったく同じです。コンパイラーはオブジェクトコンストラクターを次のように呼び出します。

T *p = new T;

になります (有効な構文ではなく、 にT::operator newなる可能性があります::operator new):

T *p = T::operator new(sizeof(T)); p->T(); 

配置に関しては、ほぼ同じです。

T *p = new(somewhere) T;

になります(上記のように無効です):

T *p = T::operator new(sizeof(T), somewhere); p->T(); 

このようなものがある場合:

class C { ... };

class A 
{
   ... 
   C c; 
};

class B: public A
{
  ...
}

B のコンストラクターが呼び出されると、C のコンストラクターが自動的に呼び出されます。(そして、B のコンストラクターは自動的に A のコンストラクターを呼び出します)

于 2013-06-11T11:38:19.630 に答える