2010-10-26 7 views
6

Attualmente voglio rendere la classe accessor wrapper in ambiente multithread. Lo scopo della classe è semplice: afferra un blocco sulla sua costruzione e rilascia un blocco sulla sua distruzione. Oltre a questo, è identico a un puntatore normale. Inoltre, voglio evitare che venga creato su un'area heap per garantire che il blocco verrà rilasciato alla fine.La variabile stack-only è possibile in C++?

L'inverso è abbastanza semplice (costruttore privato con metodo factory), ma non so che sia possibile una variabile solo stack. C'è comunque?

+2

Penso che cose come queste non siano necessarie. Ogni programmatore decente dovrebbe sapere di usare nuovo/eliminare a proprio rischio. Se il programmatore vuole questo oggetto sullo heap e getta via il punto dell'esistenza delle classi, lasciali. –

+0

Quello che chiedi è impossibile e non necessario. Se un programmatore incompetente utilizza il tuo codice, riuscirà comunque a rompere la propria applicazione * in ogni caso *. E se sono competenti, allocheranno il tuo oggetto di blocco nel modo in cui è destinato a: in un contesto di ambito. – jalf

+5

"Proteggi contro Murphy, non Machiavelli" - Herb Sutter – MSalters

risposta

12

Beh, che ne dici di sovraccaricare operator new per la tua classe e delcare privato?

+0

Grazie. Sono stato completamente dimenticato dell'operatore nuovo fino ad ora! Anche se non può impedirne completamente la creazione su un'area heap (poiché può essere una variabile membro in un oggetto creato da un nuovo operatore), ma sarebbe utile prevenire molti errori. – summerlight

+0

@summerlight: credo sia impossibile impedire COMPLETAMENTE di essere creato su heap in fase di compilazione o portabile. –

+4

sì, anche con un operatore privato 'nuovo', sarebbe qualcosa come 5 linee di codice per scrivere un oggetto wrapper che * contiene * il tuo oggetto e che può essere allocato sull'heap. Come sempre quando si scrive codice libreria C++, non è possibile dettare come l'utente * deve * usarlo. Devi presumere che l'utente della biblioteca sia sano di mente e che in realtà non tenterà di interrompere il suo programma. E se fai questa ipotesi, allora non * hai * bisogno di rendere impossibile allocare il tuo oggetto. – jalf

0

Non capisco il problema? Qualsiasi variabile definita nell'ambito di una funzione è solo stack.

class Lock { 
public: 
    Lock() { 
     performLock(); 
    } 

    ~Lock() { 
     performUnlock(); 
    } 
} 

void foo() { 
    // ... Code 
    Lock onStackOnly; 
    // ... Code that is locked 
} 


void foo() { 
    // ... Code 
    { 
     Lock onStackOnly; 
     // ... Code that is locked 
    } 

    // This code is unlocked. 
} 
+0

"Voglio impedire che venga creato nell'area dell'heap". Vuole 'new Lock();' per non essere possibile –

+3

la sua domanda è su come forzare la variabile da definire nell'ambito di un blocco e impedire qualsiasi istanza sull'heap. – BatchyX

Problemi correlati