2010-10-26 16 views
6

Actualmente Quiero hacer clase contenedora de acceso en el entorno multiproceso. El objetivo de la clase es simple: asegure su construcción y libere la cerradura de su destrucción. Aparte de eso, es idéntico a un puntero normal. Además, quiero evitar que se cree en el área de montón para asegurar que el bloqueo se liberará eventualmente.¿Es posible la variable solo de pila en C++?

La inversa es bastante fácil (constructor privado con el método de fábrica), pero no saben que una variable de pila sólo es posible. ¿Hay alguna manera?

+2

Creo que cosas como estas son innecesarias. Todo programador decente debe saber usar new/delete bajo su propio riesgo. Si el programador quiere este objeto en el montón y desecha el punto de la existencia de clases, déjalos. –

+0

Lo que estás pidiendo es imposible e innecesario. Si un programador incompetente usa tu código, ellos lograrán romper su propia aplicación * de todos modos *. Y si son competentes, asignarán su objeto de bloqueo de la forma en que debe hacerlo: en un contexto de ámbito. – jalf

+5

"Proteger contra Murphy, no Maquiavelo" - Herb Sutter – MSalters

Respuesta

12

Bueno, ¿qué pasa con sobrecarga operator new para su clase y delcare en privado?

+0

Gracias. ¡Me han olvidado por completo del operador nuevo hasta ahora! Aunque no puede evitar completamente que se cree en el área de montón (ya que puede ser una variable miembro en un objeto creado por un nuevo operador), pero sería útil evitar muchos errores. – summerlight

+0

@summerlight: Creo que es imposible evitar por completo que se creen en el montón de tiempo de compilación o de forma portátil. –

+4

yup, incluso con un 'operador nuevo' privado, sería algo así como 5 líneas de código para escribir un objeto contenedor que * contiene * su objeto y que puede asignarse en el montón. Como siempre cuando escribe código de biblioteca C++, no puede dictar cómo el usuario * debe * usarlo. Debe suponer que el usuario de la biblioteca está en su sano juicio y no intentará realmente romper su propio programa. Y si hace esa suposición, entonces no * necesita * para que sea imposible asignar su objeto de forma aleatoria. – jalf

0

No entiendo el problema? Cualquier variable definida dentro del alcance de una función es solo de pila.

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

"Quiero evitar que se cree en el área de montón". Quiere que 'new Lock();' no sea posible –

+3

su pregunta es sobre cómo forzar que la variable se defina dentro del alcance de un bloque y evitar cualquier creación de instancias en el montón. – BatchyX

Cuestiones relacionadas