|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
[C++]Assegnare un campo di una classe con "una_stringa"
Ho un dubbio sull'assegnazione di un campo di una classe con un oggetto di tipo char * non allocato con malloc ma come un letterale "xxxxxx", ad esempio:
Codice:
class A{
const char * value;
A(const char * v){
value = v;
}
}
Quindi in una funzione posso fare:
A * create(){
a = new A("ciao");
return a;
}
Ciao e grazie.
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|
|
|
|
|
#2 | ||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Re: [C++]Assegnare un campo di una classe con "una_stringa"
Quote:
Inoltre, nella classe A, il campo value e' semplicemente un puntatore a char: quando invochi new A("ciao"), value si limita a puntare all'inizio di "ciao", e quando l'oggetto a viene deallocato, la stessa sorte tocca a value ma non a "ciao". Quote:
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
||
|
|
|
|
|
#3 | |||
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Re: Re: [C++]Assegnare un campo di una classe con "una_stringa"
Quote:
Quote:
Quote:
Ciao.
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|||
|
|
|
|
|
#4 | ||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Re: Re: Re: [C++]Assegnare un campo di una classe con "una_stringa"
Quote:
Puoi ripostarla mettendo la virgola dove va davvero? Quote:
Codice:
class A {
int n;
public:
A(int *p) {
n=*p;
}
};
A* create() {
int n=10;
return new A(&n);
}
Se invece fosse stato: Codice:
class A {
int *p;
public:
A(int *q) {
p=q;
}
};
A* create() {
int n=10;
return new A(&n);
}
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
||
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Il senso della frase era:
"Se pero la variabile puntata da quel puntatore fosse stata deallocata automaticamente (cioè deallocata all'uscita dalla funzione), all'uscita dalla funzione il campo della classe avrebbe continuato a puntare ad una zona di memoria deallocata." L'esempio che facevo con il puntatore ad int era il secondo, cioè è un errore passare come argomento del costruttore di una classe che ha un campo 'puntatore a T' un puntatore ad un oggetto T, se tale oggetto T è stato creato staticamente, cioè non con new o con malloc, perche tale oggetto ha un tempo di vita che dura la durata della funzione; il mio problema iniziale era appunto sapere se la costante 'stringa' "ciao" durava oltre la funzione. Se ad esempio ho questo scenario: Codice:
class A {
int *array;
public:
A(int *arr) {
array = arr;
}
};
A* create() {
int arr[1]={10};
return new A(arr);
}
Se la risposta alla domanda precedente è 'si', mi chiedevo se per caso scrivendo: char * c = "ciao"; il compilatore non trasformasse quest'istruzione in : char[] = "ciao"; o char[] = {'c', 'i', 'a', 'o', '\0'}; che dovrebbe appunto avere una vita limitata alla durata della funzione. Ciao.
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|
|
|
|
|
#6 | ||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
Quote:
... a naso direi che si puo' fare, perche' comunque "ciao" e' una costante stringa e dovrebbe vivere quanto il programma... ma chiedo conferma. Quello che quasi sicuramente non succede, e' la trasformazione di un puntatore in un array: di solito succede il contrario. In effetti gli array non sono puntatori e non hanno lo stesso comportamento.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
||
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Ok, se qualcuno vuole darci ulteriore conferma è benvenuto...
Intanto ho fatto una prova per verificare l'indirizzo assegnato ad una costante stringa, sembra che se si creano due costanti stringa uguali in due punti diversi del programma, esse faranno riferimento alla stessa zona di memoria che conterrà una sola volta la costante stringa; quindi se inizializzo uno dopo l'altro due oggetti passandogli una costante stringa con lo stesso valore, il campo char * dei due oggetti punterà alla stessa locazione di memoria. Questo non è un problema proprio perche tanto si tratta di una costante, e qualora venisse modificata (con un'istruzione value[0] = ...) interviene un segmentation fault; ovviamente i due campi dei due ogetti possono essere riassegnati per puntarte altrove. Codice:
#include <cstdio>
#include <iostream>
class A{
char *value;
public:
A( char *c){
value = c;
printf("\n indirizzo: %d valore: %s", value, value);
}
};
char *createCIAO(){
return "ciao";
}
char *createBYE(){
return "bye";
}
A * create(int x){
if (x == 1)
return new A("uno");
else
return new A("non uno");
}
int main(){
A a1(createCIAO());
A a2(createBYE());
std::cout << "\n\n";
A a3("ciao");
A a4("bye");
std::cout << "\n\n";
A *a5 = new A(createCIAO());
A *a6 = new A(createBYE());
std::cout << "\n\n";
create(1);
create(0);
create(1);
return 0;
}
E questo è l'output: Codice:
indirizzo: 4199088 valore: ciao indirizzo: 4199104 valore: bye indirizzo: 4199088 valore: ciao indirizzo: 4199104 valore: bye indirizzo: 4199088 valore: ciao indirizzo: 4199104 valore: bye indirizzo: 4199118 valore: uno indirizzo: 4199122 valore: non uno indirizzo: 4199118 valore: uno
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:52.



















