robrock80 (Normal User)
Pro
Messaggi: 143
Iscritto: 11/12/2006
|
Salve a tutti. Qualcuno sà perchè, dato questa header
Codice sorgente - presumibilmente C++ |
#ifndef PROVA_H_ #define PROVA_H_ class Entry { public: char* word; Entry() { word = "prova"; }; char* getWord() { return word; }; }; #endif /* PROVA_H_ */
|
e dato questo main
Codice sorgente - presumibilmente C++ |
#include <iostream> #include "Prova.h" using namespace std; int main() { Entry entry; cout << entry.getWord() << endl; return 0; }
|
Perchè il valore word viene stampato correttamente? la sequenza di caratter "Prova" non dovrebbe essere out of scope all'interno del metodo main? Ultima modifica effettuata da robrock80 il 29/05/2012 alle 11:16 |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Che vuoi dire? Tu accedi a word attraverso un metodo pubblico della classe.
Anzi, ti dirò che word dovrebbe essere un membro privato e comunque funzionerebbe.
Quindi
Codice sorgente - presumibilmente C/C++ |
class Entry {
char* word;
public:
Entry() {
...
|
Occhio all'assegnazione che hai fatto con
word = "prova";
perché così assegni solamente il puntatore alla stringa costante. La stringa non sarà modificabile.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
robrock80 (Normal User)
Pro
Messaggi: 143
Iscritto: 11/12/2006
|
Postato originariamente da nessuno:
Occhio all'assegnazione che hai fatto con
word = "prova";
perché così assegni solamente il puntatore alla stringa costante. La stringa non sarà modificabile. |
Ecco, proprio a quell'assegnazione mi riferivo: essa viene effettuata all'interno del costruttore, e quindi, mi chiedevo, seccome "Prova" viene creata nel costruttore, perchè continua ad esistere anche dopo che il costruttore è stato invocato? |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Perché è una costante e vale ovunque.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
robrock80 (Normal User)
Pro
Messaggi: 143
Iscritto: 11/12/2006
|
Ok, grazie. Ma quindi bisogna fare attenzione a usare le costanti altrimenti si rischiano perdite di memoria giusto? Altra cosa: è una cosa sporca fare una conversione di questo tipo
Codice sorgente - presumibilmente Plain Text |
char* id = const_cast<char*>("GF");
|
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Postato originariamente da robrock80:
Ok, grazie. Ma quindi bisogna fare attenzione a usare le costanti altrimenti si rischiano perdite di memoria giusto? |
No ... non memory leak perché non hai allocato memoria ...
Altra cosa: è una cosa sporca fare una conversione di questo tipo
Codice sorgente - presumibilmente Plain Text |
char* id = const_cast<char*>("GF");
|
|
No ... ma non ha molto senso in questo contesto ... non so cosa pensi di ottenere ma probabilmente non ti servirebbe ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
robrock80 (Normal User)
Pro
Messaggi: 143
Iscritto: 11/12/2006
|
No ... non memory leak perché non hai allocato memoria ...
|
... Però, così a intuito, prendendo come spunto il caso di prima, se successivamente all'associazione di quella stringa al puntatore ne associo una nuova, quella vecchia rimane allocata nella parte di memoria riservata alle variabili globali e alle variabili statiche (che non ricordo come si chiama) e quindi il programma in esecuzione occupa più risorse rispetto a un'allocazione e deallocazione dinamica, o no?
No ... ma non ha molto senso in questo contesto ... non so cosa pensi di ottenere ma probabilmente non ti servirebbe ...
|
Il problema è che gcc se scrivo una cosa del genere
Codice sorgente - presumibilmente Plain Text |
mi dà un warning di questo tipo "deprecated conversion from string constant to 'char*' [-Wwrite-strings]" e invece nell'altra maniera no. Ultima modifica effettuata da robrock80 il 29/05/2012 alle 14:53 |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Postato originariamente da robrock80:
... prendendo come spunto il caso di prima, se successivamente all'associazione di quella stringa al puntatore ne associo una nuova, quella vecchia rimane allocata ... |
Nel caso di
word = "prova";
non hai allocato nulla. Ok ?
E' un warning che puoi ignorare ... oppure va bene il casting ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|