Cancellare un carattere []
Domanda
Va ??bene, sto lavorando su un codice di qualcun altro. Fanno molto di questo:
char description[256];
description[0]=0;
So che questo metterebbe un \ 0 nel primo punto dell'array di caratteri. Ma è anche un modo sicuro per cancellare una stringa?
Anche Visual Studio continua a segnalare perdite di memoria, e l'ho praticamente legato alle stringhe utilizzate.
Ps. Sì, lo so di std :: string, sì, lo uso. Questo non è il mio codice.
Soluzione
Per inizializzare la stringa su 0, puoi fare:
char description[256] = {0};
che assegnerà 0 a ogni elemento dell'array.
Basta impostare il primo elemento su 0
( '\ 0'
) non cancella il suo contenuto. Non garantisce nemmeno che l'intera stringa sia impostata sul carattere null.
Come affermato da altri, non puoi " cancellare " oggetti creati staticamente fino alla chiusura della funzione, quando viene abbandonata. Tecnicamente, non viene cancellato nemmeno quando la funzione viene abbandonata: il puntatore dello stack viene semplicemente modificato. Se sei paranoico sui dati che vengono cancellati, dovresti scorrere l'array, impostando ogni voce su 0
( '\ 0'
).
Altri suggerimenti
L'impostazione del primo elemento dell'array char su \ 0 è sufficiente per garantire che 'description' sia una stringa formattata correttamente. Gli elementi da 1 a 255 possono essere tutti spazzatura, purché l'elemento 0 sia 0, la descrizione è una stringa di lunghezza zero.
Non devi preoccuparti di perdite di memoria nel codice pubblicato sopra, perché l'array è allocato nello stack. Una volta che cade dallo stack (esce dall'ambito), l'array char viene deallocato.
Questa stringa è allocata nello stack, quindi non c'è modo di liberare la memoria che usa fino a quando la funzione che viene chiamata non ritorna (quando accadrà automaticamente). A meno che tu non stia chiamando questa funzione in modo ricorsivo *, non c'è modo che ciò finisca per essere una perdita di memoria, perché una volta che la funzione restituisce lo spazio viene utilizzato per i frame di stack futuri. E se sei preoccupato per la sicurezza, dovresti semplicemente scorrere e azzerare gli elementi della stringa.
Se si desidera un blocco di memoria libero (), è possibile effettuare le seguenti operazioni e allocare l'array sull'heap:
char *str = malloc(256*sizeof(char)); // str now is a pointer to a 256-char array
...
// some code here
...
free(str); // free the memory
* questa non è una perdita di memoria acuta, ma alcune persone dicono "perdita di memoria" quando significano "esaurire la memoria". In ogni caso, lo spazio dello stack è molto più limitato dello spazio dell'heap, quindi devi guardare la dimensione dei blocchi di memoria che usi lì.
Per chiarire le buone risposte fornite finora:
-
Sì, la descrizione [0] = 0 cancella la stringa dalle funzioni strxxx POW: strlen (descrizione) == 0, strcmp (descrizione, " ") == 0 e std :: string (descrizione) == " " sono tutti veri.
-
No, la descrizione [0] = 0 non è la stessa cosa di libero (descrizione) o memset (descrizione, 0, dimensione della descrizione). Ma lo sapevi già.
-
Il pezzo di codice che citi non può comportare una perdita di memoria. La memoria non è allocata sull'heap e le perdite di memoria sono una cosa heap.
Inserire \ 0
nel primo elemento di una stringa è un modo sicuro per cancellare la stringa, ma ciò non equivale a cancellare la stringa e non impedisce perdite di memoria.
Se è una stringa char [] e le uniche operazioni eseguite su di essa sono funzioni stringa, va bene. Naturalmente, non è abbastanza buono per i dati protetti.
Per quanto riguarda le perdite di memoria, potrebbe valere la pena passare alle versioni sicure delle funzioni di stringa, ma non è possibile perdere stringhe statiche o basate su stack, quindi è probabilmente da qualche parte che viene passata la stringa.
Per chiarezza, lo cambierei in '\ 0'.