CString et la mémoire

CString et la mémoire - Programmation

Marsh Posté le 04-04-2001 à 08:40:24    

Quand on créer une variable CString, elle aloue de la mémoire a une autre variable de type LPTSTR (ou dans le genre).  
Mais je voudrais bien savoir quand est-ce que celle-ci est détruite (il faut bien). Dans le destructeur ? oui mais pas quand on passer cette var Cstring a une autre LPTSTR. Dans ce cas, où la mémoire est elle libéré ?


---------------
haahhahahaha == TheJackal
Reply

Marsh Posté le 04-04-2001 à 08:40:24   

Reply

Marsh Posté le 04-04-2001 à 08:59:51    

dans le cas d'une string la methode c_str() renvoie un const char* qui est alloue dans l'objet. c'est l'objet qui a la charge de desallouer cette memoire, donc au plus tard dans le destructeur.
les methodes qui utilisent ce char* doivent en tenir compte et eventuellement faire une copie de la chaine.
 
J'imagine qu'avec les Cstring c'est la meme chose.

Reply

Marsh Posté le 05-04-2001 à 12:10:15    

je sais que dans CString ya un sys d'incrémentation pour la variable qui est partagé.
Celle-ci est détruite uniquement si la var d'incrémentation est égale à zero.  
Mais par exemple:
 
CString func()
{
    CString t;
    t = "salut";
    return t;
}
 
ca marche mais comment CString sait qu'il faut incrémenter a ce moment ? car le destructeur devrai détruire la variable comme elle n'a qu'une seule ref.


---------------
haahhahahaha == TheJackal
Reply

Marsh Posté le 05-04-2001 à 13:53:27    

haahhahahaha a écrit a écrit :

je sais que dans CString ya un sys d'incrémentation pour la variable qui est partagé.
Celle-ci est détruite uniquement si la var d'incrémentation est égale à zero.  
Mais par exemple:
 
CString func()
{
    CString t;
    t = "salut";
    return t;
}
 
ca marche mais comment CString sait qu'il faut incrémenter a ce moment ? car le destructeur devrai détruire la variable comme elle n'a qu'une seule ref.




Quel compteur de reference... Je ne pense pas qu'il y ai de pointeur intelligent dans les CString.
Ton exemple de code c'est du C++ standard.
 
au return est cree une copie de t par le constructeur de copie Cstring(const CString&) qui est automatiquement genere si il n'a pas ete defini. cette copie est passe en sortie et t est detruit.
 
Il n'y a rien de sorcier...

Reply

Marsh Posté le 05-04-2001 à 14:31:11    

non c pas comme ca.
CString possède un pointeur de LPTSTR. Quand CString est copié, elle copy le pointeur et non pas la chaine.
Je suis sur quil ya une variable d'incrémentation mais je voudrai savoir quand elle est incrémenter


---------------
haahhahahaha == TheJackal
Reply

Marsh Posté le 05-04-2001 à 15:08:04    

Si il y a une variable d'incrémentation, elle est modifié dans les constructeurs et destructeurs.
 
CString func()  
                {  
                    CString t; // refcount = 1
                    t = "salut";  
                    return t; // construction par copie d'un temporaire pour la valuer de retour, refcount = 2  
               } // destruction de t, refcount = 1

Reply

Marsh Posté le 05-04-2001 à 15:29:24    

Verdoux a écrit a écrit :

Si il y a une variable d'incrémentation, elle est modifié dans les constructeurs et destructeurs.
 
CString func()  
                {  
                    CString t; // refcount = 1
                    t = "salut";  
                    return t; // construction par copie d'un temporaire pour la valuer de retour, refcount = 2  
               } // destruction de t, refcount = 1




C'est l'implementation ca, il pourrait la copier ca ne changerait pas gd chose (sauf en perf)
 
mais si tu obtiens le LPTSTR (char * je suppose) puis que tu dtruits le CString... ton pointeur il n'est plus bon...

Reply

Marsh Posté le 05-04-2001 à 15:34:13    

Si parce que le destructeur ne va pas libérer la mémoire du buffer sous jacent si refcount != 0.

Reply

Marsh Posté le 05-04-2001 à 15:42:14    

Je suis desolee...
 
Je me suis mal fait comprendre...
si tu fait
CString *Var1 =new CString( "J'ai raison" );
char *Var2 = Var1.ceQuilfaut();
delete Var1;
 
ben Var2 y pointe sur n'importe quoi...

Reply

Marsh Posté le 05-04-2001 à 15:49:36    

Certes mais c'est pas comme ça qu'il faut s'en servir, tu mixes un pointeur bête et un objet encapsulant un buffer et tu fais exprès de contourner le mécanisme de comptage de référence :D
En plus MS déconseille d'allouer des Cstring sur le tas.

Reply

Marsh Posté le 05-04-2001 à 15:49:36   

Reply

Marsh Posté le 05-04-2001 à 15:58:45    

Dis le que je fais rien qu'a t'embetter...
En fait je n'ai jamais utilise de CString et je pensais en fait a :
string *var1 = new string("meme quand j'ai tors" );
char *var2 = var1->c_str();
delete var1;
 
et ce qui m'y a fait penser c'est la phrase :
"mais pas quand on passer cette var Cstring a une autre LPTSTR."
:sweet:

Reply

Marsh Posté le 05-04-2001 à 16:54:20    

Citation :

// construction par copie d'un temporaire pour la valuer de retour, refcount =


comment il fait ca ? c dans un contructeur ? un operateur ?lekel ?


---------------
haahhahahaha == TheJackal
Reply

Marsh Posté le 05-04-2001 à 16:56:17    

si c le constructeur pale je pense pas qu'il est appelé quand on utilise return


---------------
haahhahahaha == TheJackal
Reply

Marsh Posté le 05-04-2001 à 17:58:08    

haahhahahaha a écrit a écrit :

Citation :

// construction par copie d'un temporaire pour la valuer de retour, refcount =


comment il fait ca ? c dans un contructeur ? un operateur ?lekel ?




Comme ta fonction retourne un objet Cstring, le constructeur est appelé pour le fabriquer au retour de la fonction. Ce n'est pas t qui est retourné mais un cstring construit par copie.

Reply

Marsh Posté le 05-04-2001 à 18:23:07    

ca va pas:
 
Test Get()
{
    Test g;
    return g;
}
 
int main()
{
    Test t;
    t = Get();
};
 
le prog fait comme çà :
- constructeur de t;
- constructeur de g;
- return;
- destructeur de g;
- operateur= de t avec g (mais ki est détuit !);
- destructeur de g;
- destructeur de t;
 
donc après return ya le destructeur et la variable ne s'incrémente pas avec l'op= de Test.
aussi juste après return, la variable est détruite en ayant qu'une ref. et l'égale possède un g dont le pointeur interne a été détruit.
 
Comment fait CString puisque la var n'est pas détruite après return ?


---------------
haahhahahaha == TheJackal
Reply

Marsh Posté le 05-04-2001 à 18:35:11    

Non le compilo c++ ajoute des trucs dans ton dos, il est malin.
La séquence est :
- constructeur de t;  
- constructeur de g;  
- constructeur de temp par copie  
- destructeur de g;  
- operateur= de t avec temp  
- destructeur de temp  
- destructeur de t;

Reply

Marsh Posté le 05-04-2001 à 19:06:50    

c koi l'implementation du constructeur de temp par copie.
C surement pas Test() j'ai essayer.
j'ai trouvé l'ordre en metant des printf dans chaque impl.


---------------
haahhahahaha == TheJackal
Reply

Marsh Posté le 05-04-2001 à 19:12:08    

Si tu ne donnes pas de constructeur par copie, le compilo le génère lui-même.
 
Ajoute le constructeur suivant et tu verras:
Test(const Test& ){printf("Constructeur par copie\n" );}

 

[edit]--Message édité par Verdoux--[/edit]

Reply

Marsh Posté le 05-04-2001 à 20:47:11    

Merci je l'avais complétement oublier celui là.
En fait, je voulai faire une classe  semblable à CString car je déteste MFC.


---------------
haahhahahaha == TheJackal
Reply

Marsh Posté le 05-04-2001 à 21:08:02    

>Non le compilo c++ ajoute des trucs dans ton dos, il est malin.  
 
Oui, le compilo il fait ce que le standard lui dit de faire. Je te conseille de relire The C++ Programming Language de Stroustrup (3e edition) a la section 11.3.4 au sujet du default copy constructor.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 06-04-2001 à 09:00:59    

haahhahahaha a écrit a écrit :

Merci je l'avais complétement oublier celui là.
En fait, je voulai faire une classe  semblable à CString car je déteste MFC.




Pourquoi ne pas utiliser la strinb STL plutot que de faire quelque chose qui a deja ete fait plusieurs fois ?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed