2016-03-15 12 views
7

This question chiede quale sia il tipo dinamico dell'oggetto assegnato dal malloc e secondo la risposta all'inizio:A che punto la memoria allocata da malloc ottiene un tipo?

Il valore di ritorno malloc è un blocco di memorizzazione non inizializzato. Nessun oggetto è stato costruito all'interno di quella memoria. E quindi non ha tipo dinamico.

Questo porta un'altra domanda: a che punto ha senso dire che la memoria restituita da malloc ottiene un tipo. Ad esempio:

void *p = malloc(sizeof(int)); 
int *pi = (int*)p; 

possiamo dire che pi sopra punta a un oggetto di tipo dinamico int nonostante il fatto che esso è inizializzato?

+0

Non ho il riferimento alla mano, ma come una non risposta in attesa, è quando si scrive un 'int 'ad esso. Il riferimento è da qualche parte nelle cose sulla vita degli oggetti (in particolare dei tipi di POD), se qualcun altro vuole fare il lavoro e reclamare la gloria. –

+0

@SteveJessop Le cose sulla vita degli oggetti non dicono questo (in C++ 14). –

+0

@ M.M: oh, l'hanno cambiato allora? –

risposta

7

Lo status quo secondo lo standard è che non ci sono oggetti lì.

[intro.object]/1:

Un oggetto viene creato da un definizione ([basic.def]), da un nuova espressione ([expr.new]) o mediante l'applicazione ([class.temporary]) quando necessario.

Vedi anche la discussione in P0137, il che renderebbe la citazione sopra la definizione di oggetto:

Redazione nota: questo mantiene lo status quo che da sola malloc è non è sufficiente per creare un oggetto.

(int *)p è nessuna di queste.

+0

Fantastico, grazie! – vitaut

+0

Quindi, se si fa '* p = 0;', è * che * quindi un oggetto? Oppure 'int's con oggetti di durata di archiviazione statici, automatici o di thread perché sono creati da definizioni, mentre' int's con durata di archiviazione dinamica non sono oggetti a meno che non si usi una nuova espressione, e nessuna delle cose lo standard dice che gli oggetti si applicano a loro? –

+1

@SteveJessop '* p = 0' non crea un oggetto, ma' new (p) int() 'ne crea uno. –

2

La risposta è: quando viene creato un oggetto nella memoria che malloc() assegna.

Nota: malloc() è definito nello standard C e fatto riferimento nello standard C++. Le interazioni con lo standard C++ sono intese per compatibilità, non come fonte primaria.

Ciò che malloc() restituisce è un puntatore a un'area di memorizzazione univoca (o NULL). Non assegna o restituisce un oggetto. Un oggetto può essere creato in quella memoria con vari mezzi, ed è l'oggetto che ha un tipo, non la memoria.

Il codice di esempio fornito nella domanda crea un puntatore digitato, ma non ha alcun effetto sull'archiviazione.

Problemi correlati