Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1281 connectés 

  FORUM HardWare.fr
  Programmation

  CString et la mémoire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

CString et la mémoire

n°22158
haahhahaha​ha
Posté le 04-04-2001 à 08:40:24  profilanswer
 

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
mood
Publicité
Posté le 04-04-2001 à 08:40:24  profilanswer
 

n°22162
BENB
100% Lux.
Posté le 04-04-2001 à 08:59:51  profilanswer
 

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.

n°22510
haahhahaha​ha
Posté le 05-04-2001 à 12:10:15  profilanswer
 

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
n°22571
BENB
100% Lux.
Posté le 05-04-2001 à 13:53:27  profilanswer
 

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

n°22592
haahhahaha​ha
Posté le 05-04-2001 à 14:31:11  profilanswer
 

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
n°22608
verdoux
And I'm still waiting
Posté le 05-04-2001 à 15:08:04  profilanswer
 

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

n°22615
BENB
100% Lux.
Posté le 05-04-2001 à 15:29:24  profilanswer
 

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

n°22618
verdoux
And I'm still waiting
Posté le 05-04-2001 à 15:34:13  profilanswer
 

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

n°22622
BENB
100% Lux.
Posté le 05-04-2001 à 15:42:14  profilanswer
 

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

n°22629
verdoux
And I'm still waiting
Posté le 05-04-2001 à 15:49:36  profilanswer
 

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.

mood
Publicité
Posté le 05-04-2001 à 15:49:36  profilanswer
 

n°22636
BENB
100% Lux.
Posté le 05-04-2001 à 15:58:45  profilanswer
 

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:

n°22659
haahhahaha​ha
Posté le 05-04-2001 à 16:54:20  profilanswer
 

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
n°22662
haahhahaha​ha
Posté le 05-04-2001 à 16:56:17  profilanswer
 

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


---------------
haahhahahaha == TheJackal
n°22673
verdoux
And I'm still waiting
Posté le 05-04-2001 à 17:58:08  profilanswer
 

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.

n°22682
haahhahaha​ha
Posté le 05-04-2001 à 18:23:07  profilanswer
 

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
n°22688
verdoux
And I'm still waiting
Posté le 05-04-2001 à 18:35:11  profilanswer
 

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;

n°22694
haahhahaha​ha
Posté le 05-04-2001 à 19:06:50  profilanswer
 

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
n°22695
verdoux
And I'm still waiting
Posté le 05-04-2001 à 19:12:08  profilanswer
 

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]

n°22710
haahhahaha​ha
Posté le 05-04-2001 à 20:47:11  profilanswer
 

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
n°22721
gilou
Modérateur
Modzilla
Posté le 05-04-2001 à 21:08:02  profilanswer
 

>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é!  --
n°22805
BENB
100% Lux.
Posté le 06-04-2001 à 09:00:59  profilanswer
 

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 ?

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  CString et la mémoire

 

Sujets relatifs
[C] écrire dans la mémoire video...NT: liste des dlls chargées en mémoire ?
Afficher des infos sur la memoire en version texte !C++ Pb de libération de memoire.
problème de mémoire XMS avec un 386[Javascript] Limitation de mémoire @ déclarations de vars/arrays ?
ajout de mémoireplace mémoire dispo en C++
[Visual C++] classe CString 
Plus de sujets relatifs à : CString et la mémoire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR