2015-10-23 11 views
5

Tutti!È delete [] uguale a per elemento delete. C++

Diciamo che sto scrivendo la classe Array e vogliono ottimizzare la costruzione

data = reinterpret_cast<T*>(new char[sizeof (T) * size]); 
    for (int i = 0; i < size; ++i) { 
     new(&data[i]) T(some_value); 
} 

E ora mi chiedo come liberare la memoria in modo corretto:

  1. delete[] data;

  2. for (int i = 0; i < size; ++i) { data_[i].~T(); }

+0

Si sta tentando di riscrivere ['std :: array'] (http://en.cppreference.com/w/cpp/container/array)? – NathanOliver

+0

Cosa succede se l'array allocato non è l'allineamento corretto per T? –

+0

@NathanOliver, certo che non sto provando a fare questo :-) Questa è tutta la mia curiosa immaginazione. – aob

risposta

2

L'espressione delete [] dati devono corrispondere nuovo T [] che ha creato la matrice sul mucchio, in modo che T è il tipo di * dati. Altrimenti il ​​comportamento del programma non è definito (5.3.5).

Nel tuo esempio, il tipo di dati e dati * è sconosciuto. Se T non è char, il comportamento non è definito.

Si dovrebbe non chiamata delete [] i dati, anche dopo aver chiamato i distruttori del ciclo. È preferibile chiamare delete [] reinterpret_cast < char * > (dati) per evitare comportamenti non definiti. I distruttori del tipo T devono essere richiamati prima di liberare la memoria.

1

È necessario chiamare prima i distruttori prima di delete i dati.

// First step 
for (int i = 0; i < size; ++i) { 
    data_[i].~T(); 
} 

// Second step 
delete [] data; 
0
// First, you must call the destructors, so that objects will be destroyed 
for (int i = 0; i < size; ++i) { 
    data_[i].~T(); 
} 

// Then, deallocate memory from the heap. 
delete[] data;