Mais pourquoi ça compile ?

Mais pourquoi ça compile ? - C++ - Programmation

Marsh Posté le 27-08-2004 à 19:23:23    


kadreg@rincevent:~$ cat ./const.cpp
 
int main () {
  const char *s1 = new char [512];
 
  delete [] s1;
}
kadreg@rincevent:~$ /usr/local/bin/g++ -g -Wall -o const ./const.cpp
kadreg@rincevent:~$ ./const
kadreg@rincevent:~$ /usr/local/bin/g++ --version
g++ (GCC) 3.4.1
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
kadreg@rincevent:~$


 
Pour quoi g++ accepte t'il de me faire un delete sur un const char * ? Un delete n'est pas considéré comme une opération pouvant modifier un élément ?  
 
(d'ailleurs, ça ne marche pas sur le visual6, mais c'est pas une référence ...)


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 27-08-2004 à 19:23:23   

Reply

Marsh Posté le 27-08-2004 à 19:25:26    

Va savoir, charles
 

Code :
  1. void prout(const char *toto)
  2. {
  3. delete[]toto;
  4. }


 
compile sous vs 7.1

Reply

Marsh Posté le 27-08-2004 à 19:31:32    

chrisbk a écrit :

Va savoir, charles
 

Code :
  1. void prout(const char *toto)
  2. {
  3. delete[]toto;
  4. }


 
compile sous vs 7.1


 
 
:/ ah quand meme  
 
 
kad> /usr/local/bin est pas dans ton path? et pourquoi taper ./ pour le repertoire courant ?


---------------
IVG en france
Reply

Marsh Posté le 27-08-2004 à 19:34:54    

uriel a écrit :


kad> /usr/local/bin est pas dans ton path? et pourquoi taper ./ pour le repertoire courant ?


 
Si, mais après /usr/bin qui contient le gcc par défaut de ma daubianne (2.95). Celui dans /usr/local me sert à vérifier l'état avec un g++ uptodate.
 
Et on ne met pas . dans son path, c'est pas hygiénique :o


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 27-08-2004 à 19:36:14    

kadreg a écrit :


Et on ne met pas . dans son path, c'est pas hygiénique :o


 
je parlais de ca:

Citation :

kadreg@rincevent:~$ cat ./const.cpp


 
le ./ sert pas :??:


---------------
IVG en france
Reply

Marsh Posté le 27-08-2004 à 19:37:23    

uriel a écrit :

je parlais de ca:

Citation :

kadreg@rincevent:~$ cat ./const.cpp


 
le ./ sert pas :??:


 
si, à la complétion :o


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 27-08-2004 à 19:38:01    

kadreg a écrit :

si, à la complétion :o


 
c'est quoi ce shell moisi ?


---------------
IVG en france
Reply

Marsh Posté le 27-08-2004 à 19:38:50    

uriel a écrit :

c'est quoi ce shell moisi ?


 
le bash de la debian :o
 


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 27-08-2004 à 19:39:10    

Bon, on se disperse pas , et on répond à la question originale :o


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 27-08-2004 à 19:39:14    

[:romf]


---------------
IVG en france
Reply

Marsh Posté le 27-08-2004 à 19:39:14   

Reply

Marsh Posté le 27-08-2004 à 19:42:58    

kadreg a écrit :

le bash de la debian :o

Ah mais je comprends maintenant que tu gueules toujours que linux c'est moisi... si t'as une debian...


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 27-08-2004 à 19:44:18    

Je gueule surtout contre la radasse que j'ai au bureau en fait :o


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 27-08-2004 à 19:47:38    

C'est du C++ valide, ce n'est pas la faute de g++

Reply

Marsh Posté le 27-08-2004 à 19:48:12    

Kristoph a écrit :

C'est du C++ valide, ce n'est pas la faute de g++


 
source ? Et pourquoi ?


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 27-08-2004 à 19:49:01    

Kristoph a écrit :

C'est du C++ valide, ce n'est pas la faute de g++


bein oué c'est bizarre, pq le :: delete[] se comporte t'il comme ça?


Message édité par schnapsmann le 27-08-2004 à 19:49:32

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 27-08-2004 à 19:50:13    

kadreg a écrit :

source ? Et pourquoi ?


 
C'est ce qu'il me semble me souvenir en tout cas. Je prefere quand même attendre que Taz vienne donner son avis :D

Reply

Marsh Posté le 27-08-2004 à 19:50:57    

Kristoph a écrit :

C'est du C++ valide, ce n'est pas la faute de g++


oui, c'est du C++ valide. ceci est autorisé pour la simple et bonne raison que  

Code :
  1. int const char *nb = new int(0);
  2. delete nb;


est autorisé et valide.


Message édité par Harkonnen le 27-08-2004 à 19:52:09

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 27-08-2004 à 19:54:28    

schnapsmann a écrit :

bein oué c'est bizarre, pq le :: delete[] se comporte t'il comme ça?


 
tiré du stroustrup mes couilles:
 

l'opérateur global delete[] est implémenté avec une fonction:
 
void operator delete[](void*);


 
voila donc ce qui expliquerai cela   [:zebra33]
 
c'est pareil avec l'opérateur global delete d'ailleurs.


Message édité par schnapsmann le 27-08-2004 à 19:55:56

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 27-08-2004 à 19:54:31    

http://www.codeguru.com/forum/show [...] did=306213
 

Citation :

It is perfectly legal to use delete on a const value. A value being const means that the value will not change. Operator delete does not change the value of the pointer -- it only invalidates the memory that the pointer points to. Operator delete may not change anything except some internal tables in the heap manager.
 
On the other hand operator new returns a value, and you are using "=", assigning a new value to the pointer. Of course this will give you an error.


Ca se tient ce qu'il dit.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 27-08-2004 à 19:58:10    

en fait les compilos doivent gérer des opérateurs delete version const pour que ça soit cohérent au niveau "constness":
 

Code :
  1. void operator ::delete(const void*);
  2. void operator ::delete[](const void*);


 
balise kipu qui me met un majuscule après :: :fou:


Message édité par schnapsmann le 27-08-2004 à 20:11:49

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 27-08-2004 à 20:09:24    

Code :
  1. int main(int argc, char *argv[])
  2. {
  3.   const char *s1 = new char [512];
  4.   delete [] s1;  // ok
  5.   s1 = 0; // ok
  6.   s1[0] = 0; // pas ok
  7.  
  8.   char * const s2 = new char [512];
  9.   delete [] s2; // ok
  10.   s2 = 0; // pas ok
  11.   s2[0]=0; // ok
  12. }


 
Faire gaffe à la position du const, ça compte.
Je sais plus la règle exacte, à voir...
 
 
Edit: et pis delete, ça change pas le contenu de s1 ni de s1[0]  [:figti]


Message édité par pascal_ le 27-08-2004 à 20:10:52
Reply

Marsh Posté le 27-08-2004 à 20:11:59    

pascal_ a écrit :


Edit: et pis delete, ça change pas le contenu de s1 ni de s1[0]  [:figti]


 
[:totoz]
 
JE HAIS CE LANGAGGGGEEEEEEE


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 27-08-2004 à 20:22:10    

pascal_ a écrit :


Faire gaffe à la position du const, ça compte.
Je sais plus la règle exacte, à voir...
 
 
Edit: et pis delete, ça change pas le contenu de s1 ni de s1[0]  [:figti]


 
ce que je critique, c'est que ça soit authorisé par un pointeur const.
 

Code :
  1. void* popo = new char[66];
  2. const void* popoConst = popo;
  3. // ok pour ça
  4. delete[] popo;
  5. // mais pas pour ça:
  6. delete[] constPopo;


Message édité par schnapsmann le 27-08-2004 à 20:22:43

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 27-08-2004 à 20:26:34    

schnapsmann a écrit :

tiré du stroustrup mes couilles:
 

l'opérateur global delete[] est implémenté avec une fonction:
 
void operator delete[](void*);


 
voila donc ce qui expliquerai cela   [:zebra33]
 
c'est pareil avec l'opérateur global delete d'ailleurs.

aors ça ça n'a rien avoir.

Reply

Marsh Posté le 27-08-2004 à 20:28:11    

schnapsmann a écrit :

ce que je critique, c'est que ça soit authorisé par un pointeur const.

pourquoi ? le paramètre de delete est une copie, ça ne pose aucun problème. si tu voulais que ça marche, il faudrait que delete mette le truc à 0 pour que ça ait un sens

Reply

Marsh Posté le 27-08-2004 à 20:36:48    

Taz a écrit :

pourquoi ? le paramètre de delete est une copie, ça ne pose aucun problème. si tu voulais que ça marche, il faudrait que delete mette le truc à 0 pour que ça ait un sens


 
okay donc delete est défini comme ça:

Code :
  1. void operator ::delete(const void*)


et non comme ceci:

Code :
  1. void operator ::delete(void*);


comme c'est écrit dans le stroustrup  [:tinostar]


Message édité par schnapsmann le 27-08-2004 à 20:37:30

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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