OVH Cloud OVH Cloud

Question stupide sur delete

4 réponses
Avatar
Aurélien REGAT-BARREL
Bonjour à tous,
J'avais jamais pensé à un truc : si je ne me trompe, le prototype de delete
c'est :
void operator delete( void * );
Alors comment peut-on lui filer un pointeur constant ?
Exemple :

void toto( void * )
{
}

const float * ptr = new float; // pointeur constant

// tenter de convertir le pointeur constant en void *
toto( ptr ); // erreur : normal
void * v = ptr; // erreur : normal

delete ptr; // ça passe, pourquoi ?

C'est stupide je sais, mais, erf, je pige pas!
Merci pour votre aide.

--
Aurélien REGAT-BARREL

4 réponses

Avatar
Falk Tannhäuser
Aurélien REGAT-BARREL wrote:
Bonjour à tous,
J'avais jamais pensé à un truc : si je ne me trompe, le prototype d e delete
c'est :
void operator delete( void * );
Alors comment peut-on lui filer un pointeur constant ?


Ça marche par magie :
§ 5.3.5/2 : "... [Note: a pointer to a const type can be the operand of a delete-expression...]"

Il ne faut pas confondre l'"expression delete" avec la fonction de déal location
("operator delete") décrite dans § 3.7.3.2 (qui, elle, prend effectiv ement un void*),
bien que cette dernière soit appelée par la première.

Falk

Avatar
Horst Kraemer
"Aurélien REGAT-BARREL" wrote:

Bonjour à tous,
J'avais jamais pensé à un truc : si je ne me trompe, le prototype de delete
c'est :
void operator delete( void * );
Alors comment peut-on lui filer un pointeur constant ?
Exemple :

void toto( void * )
{
}

const float * ptr = new float; // pointeur constant

// tenter de convertir le pointeur constant en void *
toto( ptr ); // erreur : normal
void * v = ptr; // erreur : normal

delete ptr; // ça passe, pourquoi ?

C'est stupide je sais, mais, erf, je pige pas!
Merci pour votre aide.


L'opérateur 'delete' du langage C++ utilisé dans l'expression

delete ptr;

n'est *pas* la fonction

void ::operator delete(void*);

bien qu'ils aient le même nom. L'opérateur 'delete' utilise la
fonction 'operator delete', mais il s'agit d'un niveau différent.

--
Horst

--
Lâche pas la patate!

Avatar
James Kanze
"Aurélien REGAT-BARREL" writes:

|> J'avais jamais pensé à un truc : si je ne me trompe, le prototype de
|> delete c'est :
|> void operator delete( void * );
|> Alors comment peut-on lui filer un pointeur constant ?
|> Exemple :

|> void toto( void * )
|> {
|> }

|> const float * ptr = new float; // pointeur constant

|> // tenter de convertir le pointeur constant en void *
|> toto( ptr ); // erreur : normal
|> void * v = ptr; // erreur : normal

|> delete ptr; // ça passe, pourquoi ?

|> C'est stupide je sais, mais, erf, je pige pas!

Parce que la norme dit que ça doit marcher. C'est stupide, je sais, mais
c'est comme ça.

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Avatar
Aurélien REGAT-BARREL
Désolé pour le retard.
Merci à tous.

--
Aurélien REGAT-BARREL