2013-06-11 4 views
-2

우리는 기본 클래스 A를 가지고 있습니다. 에서 파생 된 클래스 B 이제 클래스 B는 배치 new 연산자를 사용하여 할당됩니다. 클래스 내부 내 코드의 일환으로, 내가 추가 한 클래스 C는배치 new - 생성자 내부 생성자

이제 새로운 배치는 클래스 B의 내부이라고는 sizeof 클래스 B의의 malloc을 사용하고 계정 클래스 C. 클래스 C 생성자 고려하지 않습니다 건설자. (내 용의자 야)

나는 그것이 정확한지 알고 싶다. 또는 게재 위치 새 할당에서 클래스 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(); 
} 
+7

일부 코드를 알려주십시오. –

+2

귀하의 질문에 엉망입니다, 일반 "배치 새로운"아무것도 할당하지 않으며, 사용자 정의 것들은 원격으로 볼 수 없습니다 –

+0

"클래스 C 안에 클래스를 추가했습니다": 회원 또는 중첩 클래스로? –

답변

1

배치 새로운는 배치하지 않고 그냥 operator new처럼 작동합니다. 컴파일러는

T *p = new T; 

이되고이 같은 객체 생성자 뭔가를 호출 (유효하지 않은 구문을하고 T::operator new::operator new 될 수 있음) - 자체 operator new 의지도 형태가 실제 생성자를 호출하기 때문에, 건설 정확히 같은 방법 중 하나입니다 :

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

, 그것은 거의 동일합니다 :

T *p = new(somewhere) T; 

이된다 (유효하지 않은, 위와 같이) : B의 ​​생성자가 호출 될 때

class C { ... }; 

class A 
{ 
    ... 
    C c; 
}; 

class B: public A 
{ 
    ... 
} 

다음 C의 생성자가 자동으로 호출됩니다

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

이 같은이있는 경우. (그리고 B의 생성자는 자동으로 A의 생성자를 호출합니다.)

+0

그래서 C 클래스에 대해 명시적인 새 연산자가 필요하지 않습니까? 위처럼하고있는 것처럼? –

+0

당신이 찾고있는 것에 달렸습니다.'IssuResource'가 힙이 아닌 다른 곳에서 할당되어야한다면, 그렇습니다. 'IssuResource'에 대한 자동 생성은 클래스에 대한 포인터이기 때문에 자동 생성이 없습니다. –

0

sizeof에서 반환되는 값에는 모든 기본 및 멤버의 크기가 포함됩니다. 사물을 혼동시키는 다른 크기의 개념은 없습니다.

코드가 너무 복잡해 보입니다. malloc을 사용하여 수행하는 작업은 단순히 기본 동작 인 new을 다시 작성하는 것입니다.

이 같은 일을하지만, 간단한 :

card = new CardChop(spa_issu_restart); 

if (card == NULL) { 
    emLogError(EM_INTERNAL_ERROR, __FUNCTION__, 
     "exit: failed to allocate %d bytes for card object\n", 
     sizeof(CardChop) 
    ); 
    exit(1); 
} 

글로벌, 기본 operator new를 사용하는 경우, 당신은 또한 operator delete 과부하를 제거해야합니다.


사실 새로운 배치를 사용하는 가장 좋은 방법은 delete을 전혀 사용하지 않는 것입니다. (아무 것도하지 않으려면 operator delete을 정의했음을 유의하십시오.) 더 좋은 방법은


는 또한, exit는이 지역의 오브젝트를 파괴하지 않는 프로그램을 종료 할 수있는 잠재적으로 안전하지 않은 방법입니다 있습니다

card_ptr->~CardChop(); // execute destructor but no delete 
free(card_ptr); // release placement memory a la delete 

처럼 보이는 의사 소멸자 호출을 사용하는 것입니다. 대신에 예외를 throw하는 것을 고려하십시오.

+0

sizeof (CardChop)를 인쇄 해 보았는데이 글꼴에는 IssueResource (약 8MB)가 포함되어 있습니다. 여기에 문제가 있습니까? –

+0

@FatemaMerchant 뭔가 잘못되었습니다. 구조체보다 훨씬 큽니다. – Potatoswatter