Oppure

Loading
29/05/12 9:14
robrock80
Salve a tutti. Qualcuno sà perchè, dato questa header

#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

#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 29/05/12 9:16
aaa
29/05/12 9:20
nessuno
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

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à.
29/05/12 9:30
robrock80
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?
aaa
29/05/12 9:54
nessuno
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à.
29/05/12 10:02
robrock80
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

char* id = const_cast<char*>("GF");
aaa
29/05/12 12:24
nessuno
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

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à.
29/05/12 12:42
robrock80
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
char* id = "GF";


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 29/05/12 12:53
aaa
29/05/12 16:33
nessuno
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 ?

Il problema è che ...


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