2010-07-27 15 views
5

È illegale/pericoloso?Puntatore variabile statico?

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

Il compilatore non sembrano avere un problema con esso, ma è la posizione del puntatore per sé protetti dalla sovrascrittura quando qualcun altro ha bisogno di memoria?

EDIT: Un po 'più di una spiegazione del perché ho fatto questa domanda. Nota: sto programmando in C++, l'ho appena etichettato come C perché sembrava essere più di una domanda C che C++.

Ho una classe che dovrebbe restituire una mappa statica. Voglio solo che questa mappa sia inizializzata una volta durante il programma in quanto non sembra esserci la necessità di farlo più volte. Per questo motivo, stavo per avere qualcosa di simile:

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

Il costruttore di classi di transizione si aggiungerebbe alle transizioni. In questo modo, creerebbe le transizioni una volta e quindi restituirà loro un puntatore. Ricordo solo che se si crea un riferimento a una variabile allocata nello stack, questo potrebbe essere sovrascritto molto facilmente ed era "non sicuro". Ero solo un po 'confuso con esattamente come funzionano le variabili statiche create all'interno di una funzione.

+0

Se non è previsto che la mappa venga modificata dal codice client, è necessario restituire un riferimento const o un puntatore a un const. Ciò eliminerà la maggior parte dei rischi associati ai dati statici. –

risposta

5

Questo è un codice valido e utile.

Un sacco di fabbriche singleton sono costruite in questo modo.

6

Questa è solo una funzione get per il puntatore di una variabile statica. Non c'è niente di illegale in questo. Non è intrinsecamente più pericoloso di qualsiasi altro tipo di dati statici.

Ma i dati statici:

  1. crea accoppiamento stretto
  2. ceste nuovamente entrancy
  3. crea l'opportunità per i bug sottili
  4. è spesso un segno di disegno debole
  5. dovrebbe essere usato molto giudiziosamente

Lo stoccaggio statico modificatore di classe significa che la memoria sarà riservata a questa variabile per la durata del processo.

+0

+1: l'unica risposta che ha menzionato problemi di multi-threading (re-entrancy) – smerlin

+0

+1: Non è illegale, ma dannatamente bene è pericoloso. – Puppy

-1

Supponendo che hai dire int* static_nonew()

Dopo aver restituito un puntatore a qualsiasi posizione di memoria, allora che la memoria può essere sovrascritto, non ci sono garanzie di protezione C.

Inoltre, se si passa questo puntatore a free, il comportamento non è definito, quindi a volte sarà OK e talvolta eseguirà il dump del core.

D'altra parte questo è un codice completamente legale. Inoltre, è possibile sostituire int in un numero struct che è necessario inizializzare una volta ed è un linguaggio molto utile.

+0

"A volte andrà bene" è molto fuorviante. Anche se ** sembra ** ok, è probabile che la corruzione della memoria sia pericolosa. –

+0

@R .. Riesci a leggere l'intera frase? Penso che se dice core-dump ciò implica che è pericoloso. E poiché il comportamento è UNDEFINED, a volte non avrà effetti collaterali. –

1

È legale ma ricorda che avrai sempre una sola istanza di transizioni e che verrà costruita prima di main() perché è dichiarata statica. È praticamente come avere una variabile globale.

Problemi correlati