Domanda

E 'vero che un puntatore assegnato per l'indirizzo di partenza di un array allocato dinamicamente non ha l'informazione della dimensione della matrice? Quindi dobbiamo usare un'altra variabile per memorizzare la sua dimensione per la successiva elaborazione della matrice attraverso il puntatore.

Ma quando ci liberiamo l'array allocato dinamicamente, non specificare la dimensione, invece abbiamo solo "PTR libero" o "delete [] ptr". Come potrebbe liberare o cancellare conoscere la dimensione della matrice? Possiamo usare lo stesso schema di evitare di memorizzare la dimensione della matrice in un'altra variabile?

Grazie!

È stato utile?

Soluzione

Sì, questo è vero.

delete conosce la dimensione del blocco di memoria a causa new aggiunge informazioni extra per il pezzo (di solito prima che la zona restituito all'utente), contenente le sue dimensioni, insieme ad altre informazioni. Si noti che questo è tutto molto specifica implementazione e non deve essere utilizzato da codice.

Quindi, per rispondere alla tua ultima domanda: No - non possiamo usare - è un dettaglio di implementazione che è altamente piattaforma e compilatore dipendente.


Ad esempio, nel allocatore memoria campioni dimostrata in K & R2, questo è il "header" posto prima di ogni blocco allocato:

typedef long Align; /* for alignment to long boundary */

union header { /* block header */
  struct {
    union header *ptr; /* next block if on free list */
    unsigned size; /* size of this block */
  } s;

  Align x; /* force alignment of blocks */
};

typedef union header Header;

size è la dimensione del blocco allocato (che viene quindi utilizzato dagli free, o delete).

Altri suggerimenti

La cosa divertente è che, storicamente, è stato delete [20] arr; così come è arr = new int[20]. Tuttavia la pratica ha dimostrato che le informazioni sulla dimensione può essere indolore memorizzato dal allocatore, e poiché la maggior parte chi lo utilizza quindi memorizzati in ogni caso, è stato aggiunto allo standard.

Per di più divertente, e poco conosciuto, è il fatto che questo "Sintassi delete esteso" è infatti sostenuta da alcuni compilatori C ++ (pur essendo corretta, anche di fronte al C ++ 98 standard), anche se nessuno richiede esso.

int* arr = new int[20];
delete [20] arr;

La parte triste di tutto questo, tuttavia, è che non c'è modo conforme agli standard per recuperare quella dimensione passata per uso personale: - /

E 'vero che la matrice non contiene la dimensione della matrice, è necessario memorizzare le informazioni per dopo. Quando si elimina una matrice attraverso delete o free è il puntatore alla memoria allocata passate. Il gestore di memoria utilizzata (sia da parte del sistema o il proprio personalizzato di ignorare new e delete) conosce la zona di memoria che viene liberata, e tiene traccia di esso. Spero che abbia un senso.

Sì, è vero. Questo fa parte del motivo per cui si dovrebbe raramente cercare di affrontare questo direttamente, e utilizzare un contenitore standard invece. Circa l'unica volta che ha senso trattare con esso è, se si decide di implementare un contenitore da soli (nel qual caso si normalmente monitorare le informazioni sulle dimensioni nell'attuazione del contenitore).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top