Newsgroup: it.comp.lang.c++
Titolo: Puntatori intelligenti

Premettendo che non ho ancora ben chiaro a cosa servano i cosiddetti
"puntatori intelligenti", ho un dubbio su un programma di esempio del
libro:
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
struct String	{
	char* s;
	String(char* S) : s(strdup(S))	{}
	~String()	{free(s);}
};
class String_pointer	{
	String* m;
public:
	String_pointer(String& s) : m(&s)	{}
	String* operator->()	{
		return m;
	}
};
void main()	{
String_pointer X2(String("Ciao mondo!"));
cout << X2->s;
}
Il programma e' questo, ma quando lo lancio l'output e' una stringa di
caratteri strani disposti in modo casuale. Se pero' nel main, al posto
di:
	String_pointer X2(String("Ciao mondo!"));
scrivo:
String A("Ciao mondo!");
String_pointer X2(A);
tutto funziona correttamente. Come mai?
Ciao,
<manoo>

tutto funziona correttamente. Come mai?
Perche` la situazione e` completamente e drasticamente
differente: non c'e` nessuna variabile temporanea in gioco,
la variabile A e` ancora vivissima, e il suo array di char non
e` stato assoggettato a free, quando la usi nell'output.
Lippman, "Inside the C++ object model" (da non confondersi
col suo pur validissimo "Primer") sviscera e chiarisce abbastanza
a fondo questo tipo di questioni (che comunque sono almeno
nominate in qualsiasi testo decente).
Alex

   'estensione al linguaggio' fatta dal tuo compilatore...?
Invece no, non ha nulla da obiettare... e' proprio questo che mi ha
fatto venire il dubbio... comunque ora provo a vedere se in effetti
non ho (dis)sttivato qualche strana opzione...
Grazie!
Ciao,
<manoo>

non ho (dis)sttivato qualche strana opzione...
Di che marca e release si tratta?  VC++ Microsoft, ad esempio,
per _default_ ammette le "estensioni al linguaggio" -- le devi
esplicitamente togliere se non le vuoi (e se le togli la gran parte
degli header di sistema non ti compila piu`); e sempre per default
tiene i warning a livello 3, buono ma non ottimo (di nuovo, il piu`
stretto livello 4, da chiedere esplicitamente, ti riempie di warning
sui file di header di sistema).
Alex

sui file di header di sistema).
E' "piu' errore" il livello 3 o il 4?
Ciao,
<manoo>

E' "piu' errore" il livello 3 o il 4?
Nessuno dei due livelli ``e` errore'' per nulla; sono entrambi corretti.
Il livello piu` alto e`, come dicevo, piu` stretto, cioe` piu` severo.
Alex

Il livello piu` alto e`, come dicevo, piu` stretto, cioe` piu` severo.
Nessuno saprebbe consigliarmi qualche libro su questi aspetti
"corollari" del linguaggio?
Ciao,
<manoo>

hai gia` fatto free (nel distruttore della temporanea, appunto).
Una domanda su free: in questo caso l'output contiene caratteri
casuali in quanto ho gia' fatto free e probabilmente la memoria e'
gia' stata riallocata, ma potrebbe benissimo anche darsi che venga
stampata la stringa giusta, se quell'area di memoria non e' ancora
stata riallocata e sovrascritta, giusto?
Ciao,
<manoo>

stata riallocata e sovrascritta, giusto?
Potrebbe succedere, a seconda dell'ambiente in cui stai
lavorando (un buon ambiente "a debug", per esempio, dovrebbe
fare uno sforzo per "sporcare" la memoria free'ata con caratteri
strani, per cercare di evidenziare al piu` presto eventuali errori
di suo riuso, ma un ambiente "a release" sarebbe assurdo che
si prendesse questi overhead).
Alex

 wrote:


   Spesso gli ambienti di sviluppo hanno dei replacement per gli operatori
new e free che al rilascio sporcano la memoria (da me con 0xdead 0xbeef
:-)) ), hanno una marcatura dell'inizio e della fine del blocco allocato
per permettere di trovare problemi di overrun su un buffer e magari
tengono anche dietro alle allocazioni e deallocazioni in modo da
evidenziare problemi di leakage (memoria allocata e mai rilasciata).
      Cris