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.

È stato utile?

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'.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top