Domanda

Nel mio browsings tra Internet, mi sono imbattuto in questo post, che comprende questo

"(Scritto bene) C++ va alla grande lunghezze di fare stack automatico gli oggetti di lavoro ", proprio come" primitive", come riflessa in Stroustrup consigli per "fare come gli int fare".Questo richiede un molto maggiore aderenza al principi dell'Object Oriented sviluppo:la classe non è giusto fino a che non "funziona come" un int, seguendo la "Regola del Tre" che le garanzie si può (come un int) essere creati, copiati, e correttamente distrutto come una pila automatico".

Ho fatto un po ' di C e C++, ma solo di passaggio, mai nulla di grave, ma sono solo curioso di sapere, cosa significa esattamente?

Qualcuno può fare un esempio?

È stato utile?

Soluzione

Impilare oggetti sono gestiti automaticamente dal compilatore.

Quando la portata è di sinistra, viene eliminato.

{
   obj a;
} // a is destroyed here

Quando fate lo stesso con un 'novata' oggetto si ottiene una perdita di memoria :

{
    obj* b = new obj;
}

b non è distrutta, così abbiamo perso la capacità di recuperare la memoria b possiede.E forse peggio, l'oggetto non può pulire se stesso.

In C la seguente comune :

{
   FILE* pF = fopen( ... );
   // ... do sth with pF
   fclose( pF );
}

In C++ si scrive :

{
   std::fstream f( ... );
   // do sth with f
} // here f gets auto magically destroyed and the destructor frees the file

Quando ci si dimentica di chiamare fclose in C esempio il file non è chiuso e non possono essere utilizzati da altri programmi.(ad es.esso non può essere eliminato).

Un altro esempio, dimostrando l'oggetto stringa, che può essere costruita, assegnate e che viene distrutta in uscita il campo di applicazione.

{
   string v( "bob" );
   string k;

   v = k
   // v now contains "bob"
} // v + k are destroyed here, and any memory used by v + k is freed

Altri suggerimenti

In aggiunta alle altre risposte:

Il linguaggio C++ in realtà è il auto parola chiave per dichiarare esplicitamente la classe di archiviazione di un oggetto.Naturalmente, è completamente inutile, perché questo è l'implicita classe di stoccaggio per le variabili locali e non può essere utilizzato ovunque.L'opposto di auto è static (sia a livello locale che globall).

Le due dichiarazioni seguenti sono equivalenti:

int main() {
    int a;
    auto int b;
}

Perché la parola chiave è completamente inutile, sarà effettivamente riciclati nel prossimo C++ standard (“C++0x”) e ottiene un nuovo significato, che permette al compilatore di dedurre il tipo di variabile dalla sua inizializzazione (come var in C#):

auto a = std::max(1.0, 4.0); // `a` now has type double.

Le variabili in C++ può essere dichiarato in pila o heap.Quando si dichiara una variabile in C++, automaticamente va in pila, a meno che non si utilizza esplicitamente il nuovo operatore si va sul heap).

MyObject x = MyObject(params); // onto the stack

MyObject * y = new MyObject(params); // onto the heap

Questo fa una grande differenza nel modo in cui la memoria viene gestita.Quando una variabile viene dichiarata in pila, sarà deallocato quando si va fuori del campo di applicazione.Una variabile nel mucchio non sarà distrutta fino a eliminare è esplicitamente chiamato in oggetto.

Stack automatico sono le variabili di cui sono allocate sullo stack del metodo corrente.L'idea che sta dietro la progettazione di una classe che può agisce come Stack automatico è che dovrebbe essere possibile inizializzare completamente con una sola chiamata e distruggere con un altro.È essenziale che il distruttore libera tutte le risorse allocate per l'oggetto e il suo costruttore restituisce un oggetto che è stato completamente inizializzato e pronto per l'uso.Analogamente per l'operazione di copia - la classe dovrebbe essere in grado di essere facilmente copie fatte, che siano completamente funzionali e indipendenti.

L'utilizzo di tale classe deve essere simile a come primitivo int, float, etc.sono utilizzati.Li definiscono (eventualmente dare loro un valore iniziale) e poi passarli in giro e alla fine lasciare il compilatore per la pulizia.

Mi corregga se sbaglio, ma credo che l'operazione di copia non è obbligatorio prendere pieno vantaggio di stack automatico di pulizia.Si consideri, per esempio un classico MutexGuard oggetto, non ha bisogno di un operazione di copia per essere utile come stack automatico, o cosa ?

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