Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Scope putantori membro
Forum - C/C++ - Scope putantori membro

Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 11:14
Martedì, 29/05/2012
Salve a tutti. Qualcuno sà perchè, dato questa header
Codice sorgente - presumibilmente C++

  1. #ifndef PROVA_H_
  2. #define PROVA_H_
  3.  
  4. class Entry {
  5.     public:
  6.             char* word;
  7.             Entry() {
  8.                     word = "prova";
  9.             };
  10.             char* getWord() {
  11.                 return word;
  12.             };
  13.         };
  14.  
  15.  
  16. #endif /* PROVA_H_ */



e dato questo main

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include "Prova.h"
  3. using namespace std;
  4.  
  5.  
  6. int main() {
  7.         Entry entry;
  8.         cout << entry.getWord() << endl;
  9.         return 0;
  10. }



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
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:20
Martedì, 29/05/2012
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++

  1. class Entry {
  2.     char* word;
  3.     public:
  4.             Entry() {
  5.     ...



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à.
PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 11:30
Martedì, 29/05/2012
Testo quotato

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?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:54
Martedì, 29/05/2012
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à.
PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 12:02
Martedì, 29/05/2012
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

  1. char* id = const_cast<char*>("GF");


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 14:24
Martedì, 29/05/2012
Testo quotato

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

Testo quotato

Altra cosa: è una cosa sporca fare una conversione di questo tipo

Codice sorgente - presumibilmente Plain Text

  1. 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à.
PM Quote
Avatar
robrock80 (Normal User)
Pro


Messaggi: 143
Iscritto: 11/12/2006

Segnala al moderatore
Postato alle 14:42
Martedì, 29/05/2012
Testo quotato


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?

Testo quotato


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

  1. 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 il 29/05/2012 alle 14:53
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:33
Martedì, 29/05/2012
Testo quotato

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 ?

Testo quotato


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