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

  FORUM HardWare.fr
  Programmation
  C++

  Mais pourquoi ça compile ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Mais pourquoi ça compile ?

n°834501
kadreg
profil: Utilisateur
Posté le 27-08-2004 à 19:23:23  profilanswer
 


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 !
mood
Publicité
Posté le 27-08-2004 à 19:23:23  profilanswer
 

n°834502
chrisbk
-
Posté le 27-08-2004 à 19:25:26  profilanswer
 

Va savoir, charles
 

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


 
compile sous vs 7.1

n°834514
uriel
blood pt.2
Posté le 27-08-2004 à 19:31:32  profilanswer
 

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
n°834529
kadreg
profil: Utilisateur
Posté le 27-08-2004 à 19:34:54  profilanswer
 

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 !
n°834531
uriel
blood pt.2
Posté le 27-08-2004 à 19:36:14  profilanswer
 

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
n°834535
kadreg
profil: Utilisateur
Posté le 27-08-2004 à 19:37:23  profilanswer
 

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 !
n°834536
uriel
blood pt.2
Posté le 27-08-2004 à 19:38:01  profilanswer
 

kadreg a écrit :

si, à la complétion :o


 
c'est quoi ce shell moisi ?


---------------
IVG en france
n°834537
kadreg
profil: Utilisateur
Posté le 27-08-2004 à 19:38:50  profilanswer
 

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 !
n°834539
kadreg
profil: Utilisateur
Posté le 27-08-2004 à 19:39:10  profilanswer
 

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 !
n°834540
uriel
blood pt.2
Posté le 27-08-2004 à 19:39:14  profilanswer
 

[:romf]


---------------
IVG en france
mood
Publicité
Posté le 27-08-2004 à 19:39:14  profilanswer
 

n°834541
R3g
fonctionnaire certifié ITIL
Posté le 27-08-2004 à 19:42:58  profilanswer
 

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.
n°834542
kadreg
profil: Utilisateur
Posté le 27-08-2004 à 19:44:18  profilanswer
 

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 !
n°834544
Kristoph
Posté le 27-08-2004 à 19:47:38  profilanswer
 

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

n°834545
kadreg
profil: Utilisateur
Posté le 27-08-2004 à 19:48:12  profilanswer
 

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 !
n°834547
schnapsman​n
Zaford Beeblefect
Posté le 27-08-2004 à 19:49:01  profilanswer
 

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!"
n°834548
Kristoph
Posté le 27-08-2004 à 19:50:13  profilanswer
 

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

n°834550
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 27-08-2004 à 19:50:57  profilanswer
 

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)
n°834552
schnapsman​n
Zaford Beeblefect
Posté le 27-08-2004 à 19:54:28  profilanswer
 

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!"
n°834553
R3g
fonctionnaire certifié ITIL
Posté le 27-08-2004 à 19:54:31  profilanswer
 

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.
n°834556
schnapsman​n
Zaford Beeblefect
Posté le 27-08-2004 à 19:58:10  profilanswer
 

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!"
n°834568
pascal_
Posté le 27-08-2004 à 20:09:24  profilanswer
 

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
n°834572
kadreg
profil: Utilisateur
Posté le 27-08-2004 à 20:11:59  profilanswer
 

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 !
n°834582
schnapsman​n
Zaford Beeblefect
Posté le 27-08-2004 à 20:22:10  profilanswer
 

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!"
n°834585
Taz
bisounours-codeur
Posté le 27-08-2004 à 20:26:34  profilanswer
 

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.

n°834586
Taz
bisounours-codeur
Posté le 27-08-2004 à 20:28:11  profilanswer
 

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

n°834596
schnapsman​n
Zaford Beeblefect
Posté le 27-08-2004 à 20:36:48  profilanswer
 

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!"
mood
Publicité
Posté le   profilanswer
 


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

  Mais pourquoi ça compile ?

 

Sujets relatifs
Executer du code compilé...pourquoi ce code ne compile pas ? (MACOSX user asked)
Impossible de créer l'en-tête pré-compilé : code dans l'en-têteComposition de Filtre Digitaux en compile-time [RESOLU]
[ORACLE] Trigger bien compilé qui ne marche pas bien[CPP] Ca compile mais ca marche pas ... pb de gros n00b
ah compile pas !!!!!!!!!!!!Code C compilé sous Visual c++ 6 : prob de perfs...
[VC++] Ca ne compile pas et pourtant, c'est pas sorcier...[C++] Ca compile mais erreur au lancement du exe...
Plus de sujets relatifs à : Mais pourquoi ça compile ?


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)