2010-07-27 15 views
5

¿Esto es ilegal/peligroso?puntero estático variable?

int* static_nonew() 
{ 
    static int n = 5; 
    return &n; 
} 

El compilador no parecen tener un problema con él, sino que es la propia ubicación del puntero protegido de ser sobrescrito cuando alguien necesita memoria?

EDIT: Un poco más de una explicación de por qué hice esta pregunta. Nota: Estoy programando en C++, acabo de etiquetarlo como C porque parecía ser más una pregunta de C que de C++.

Tengo una clase que se supone que devuelve un mapa estático. Solo quiero que este mapa se inicialice una vez durante todo el programa, ya que no parece ser necesario hacerlo varias veces. Por esta razón, yo iba a tener algo como esto:

static std::map<std::string, Transition*> transitions; 
static Transition trans1(transitions, ...); 
static Transition trans2(transitions, ...); 
return &transitions; 

El constructor de clases de transición se sumaría a las transiciones. De esa forma, crearía las transiciones una vez y luego les devolvería un puntero. Solo recuerdo que si crea una referencia a una variable asignada en la pila, podría sobrescribirse fácilmente y sería "insegura". Estaba un poco confundido con exactamente cómo funcionan las variables estáticas creadas dentro de una función.

+0

Si no se espera que su mapa sea modificado por el código del cliente, debe devolver una referencia constante o un puntero a una const. Eso eliminará la mayoría de los riesgos asociados con los datos estáticos. –

Respuesta

5

Este es un código válido y útil.

Muchas de las fábricas de singleton están construidas de esta manera.

6

Esto es solo una función get para el puntero de una variable estática. No hay nada ilegal al respecto. No es intrínsecamente más peligroso que cualquier otro tipo de datos estáticos.

embargo, los datos estáticos:

  1. crea estrecho acoplamiento
  2. cestas de re-entrada
  3. crea la oportunidad para errores sutiles
  4. es a menudo un signo de diseño débil
  5. debe usarse muy juiciosamente

El almacenamiento estático modificador de clase significa que la memoria se reservará para esta variable durante la vida del proceso.

+0

+1: la única respuesta que menciona problemas de subprocesos múltiples (reentrada) – smerlin

+0

+1: No es ilegal, pero es muy peligroso. – Puppy

-1

Asumiendo que has significado int* static_nonew()

Una vez que regrese un puntero a cualquier posición de memoria, a continuación, que la memoria se puede sobrescribir, no hay garantías de protección en C.

Además, si pasa este puntero a free, el comportamiento no está definido, por lo que a veces estará bien y, a veces, volcará el núcleo.

Por otro lado, este es un código totalmente legal. Además, sustituya int por un struct que necesita inicializar una vez, y es una expresión bastante útil.

+0

"A veces va a estar bien" es muy engañoso. Incluso si ** parece ** correcto, es probable que haya corrupción de memoria peligrosa. –

+0

@R .. ¿Puedes leer la oración completa? Creo que si dice core-dump implica que es peligroso. Y, debido a que el comportamiento está INDEFINIDO, a veces realmente no tendrá efectos secundarios. –

1

Es legal, pero recuerde que solo tendrá una instancia de transiciones y que se construirá antes de main() porque está declarada estática. Es más o menos como tener una variable global.

Cuestiones relacionadas