2013-08-27 10 views
5
struct A final 
{ 
    int a; 

    void* operator new(size_t size) 
    { 
     // 
     // Is size always equal to sizeof(A) here? 
     // 
     return ::operator new(size); 
    } 

    void operator delete(void* ptr) 
    { 
     ::operator delete(ptr); 
    } 
}; 

int main() 
{ 
    for (auto i = 0; i < 100; i++) 
    { 
     delete new A; 
    } 
} 

La mia domanda è anche incorporata nel codice.Le dimensioni sono passate in A :: operator new() sempre uguale a sizeof (A)?

Lo standard C++ garantisce che le dimensioni passate in A :: operator new() siano sempre le stesse?

Aggiornamento: Qui, si consideri che A è solo una classe finale.

risposta

4

citazione dallo standard C++ 11, sezione 5.3.4 punto 10:

Una nuova espressione passa la quantità di spazio richiesto per la funzione assegnazione come primo argomento di tipo std :: size_t. L'argomento non deve essere inferiore alla dimensione dell'oggetto che si sta creando; potrebbe essere maggiore della dimensione dell'oggetto che si sta creando solo se l'oggetto è un array.

Quindi, sì, è garantito che sia uguale alla dimensione dell'oggetto. Si noti tuttavia che diversi compilatori o diverse opzioni del compilatore possono alterare la dimensione effettiva di un particolare oggetto in fase di compilazione.

4

No.

Prova:

struct B: public A 
{ 
    double a; 
} 

Ora il nuovo operatore otterrà una dimensione diversa quando si crea un B

int main() 
{ 
    for (auto i = 0; i < 100; i++) 
    { 
     delete new A; 
     delete new B; 
    } 
} 

PS aggiungere una stampa di vederlo:

void* operator new(size_t size) 
{ 
    std::cout << "S(" << size << ")\n"; 
    // 
    // Is size always equal to sizeof(A) here? 
    // 
    return ::operator new(size); 
} 

O scita:

> ./a.out 
S(4) 
S(12) 
S(4) 
S(12) 
S(4) 
+0

Che ne dici se A è una classe finale? – xmllmx

+1

@xmllmx: Nulla di tutto ciò in C++ –

+0

si prega di rivedere il post. L'ho revisionato. Faccio una struct A final. – xmllmx