A défaut, quelle est la façon propre de faire un
// construire l'objet
MyClass *tmp = new MyClass();
// le placer dans le tableau
vec.push_back( *tmp );
// limérer la mémoire sans appeler le destructeur
free( tmp );
Je veux bien fournir mon propre copy constructor et lui faire créer un
nouvel objet de toutes pièces, mais cela est d'une part détourner son
vrai objectif et d'autre part cela risque d'interférer avec les vraies
copies d'objet.
Il doit sûrement y avoir des raisons à cela, mais je trouve ça horrible et au risque de me faire incendier, un realloc() bien utilisé est quand même vachement pratique.
Un realloc ce n'est possible que pour des POD.
Pire que cà : que pour les PODs sans pointeurs (ou objets "pointeuresques" du type handle), à moins de vouloir explicitement faire une "shallow copy", ce qui est rarement le cas.
Il doit sûrement y avoir des raisons à cela, mais je trouve ça
horrible et au risque de me faire incendier, un realloc() bien
utilisé est quand même vachement pratique.
Un realloc ce n'est possible que pour des POD.
Pire que cà : que pour les PODs sans pointeurs (ou objets "pointeuresques"
du type handle), à moins de vouloir explicitement faire une "shallow copy",
ce qui est rarement le cas.
Il doit sûrement y avoir des raisons à cela, mais je trouve ça horrible et au risque de me faire incendier, un realloc() bien utilisé est quand même vachement pratique.
Un realloc ce n'est possible que pour des POD.
Pire que cà : que pour les PODs sans pointeurs (ou objets "pointeuresques" du type handle), à moins de vouloir explicitement faire une "shallow copy", ce qui est rarement le cas.
Arnaud
Gabriel Dos Reis
"Cyrille "cns" Szymanski" writes:
| >> A défaut, quelle est la façon propre de faire un | >> // construire l'objet | >> MyClass *tmp = new MyClass(); | >> // le placer dans le tableau | >> vec.push_back( *tmp ); | >> // limérer la mémoire sans appeler le destructeur | >> free( tmp ); | > | > Sans répondre à la question: | > | > new -> delete (et pas free) | > | | Oui, j'ai délibérément utilisé free ici pour que le destructeur n e soit pas | appelé.
C'est du fonctionnement indéfini. Rien ne dit que la mémoire obtenue par operator new() peut être libérée par free().
C'est curieux cette façon que les gens ont d'insister que leurs programmes fassent n'importe quoi en prétendant qu'ils font de l'optimisation.
| >> A défaut, quelle est la façon propre de faire un
| >> // construire l'objet
| >> MyClass *tmp = new MyClass();
| >> // le placer dans le tableau
| >> vec.push_back( *tmp );
| >> // limérer la mémoire sans appeler le destructeur
| >> free( tmp );
| >
| > Sans répondre à la question:
| >
| > new -> delete (et pas free)
| >
|
| Oui, j'ai délibérément utilisé free ici pour que le destructeur n e soit pas
| appelé.
C'est du fonctionnement indéfini. Rien ne dit que la mémoire obtenue
par operator new() peut être libérée par free().
C'est curieux cette façon que les gens ont d'insister que leurs
programmes fassent n'importe quoi en prétendant qu'ils font de
l'optimisation.
| >> A défaut, quelle est la façon propre de faire un | >> // construire l'objet | >> MyClass *tmp = new MyClass(); | >> // le placer dans le tableau | >> vec.push_back( *tmp ); | >> // limérer la mémoire sans appeler le destructeur | >> free( tmp ); | > | > Sans répondre à la question: | > | > new -> delete (et pas free) | > | | Oui, j'ai délibérément utilisé free ici pour que le destructeur n e soit pas | appelé.
C'est du fonctionnement indéfini. Rien ne dit que la mémoire obtenue par operator new() peut être libérée par free().
C'est curieux cette façon que les gens ont d'insister que leurs programmes fassent n'importe quoi en prétendant qu'ils font de l'optimisation.
-- Gaby
Christophe Lephay
"Arnaud Debaene" a écrit dans le message de news:3f480118$0$1141$
à moins de vouloir explicitement faire une "shallow copy",
C'est quoi une "shallow copy" ?
Chris
"Arnaud Debaene" <adebaene@club-internet.fr> a écrit dans le message de
news:3f480118$0$1141$626a54ce@news.free.fr...
à moins de vouloir explicitement faire une "shallow copy",
struct MyClass { HANDLE hwnd; MyClass() { hwnd = OpenHandle(); } ~MyClass() { CloseHandle( hwnd ); } }; Faire vector<MyClass> vec; for( i=0; i<10; ++i) { vec.push_back( MyClass() ); } ne fonctionne pas car le handle est fermé tout de suite.
En fait, comme on l'a dit, pour pouvoir mettre une classe dans un vector, elle DOIT pouvoir être copiée (avec la sémentique du mot copier). Ce n'est pas le cas de cette classe. Dans cet example windowsien, un truc qui ressemble à ça devrait marcher :
MyClass::MyClass(MyClass const &mc) { DuplicateHandle(GetCurrentProcess(), mc.hwnd, GetCurrentProcess(), hwn d); }
struct MyClass {
HANDLE hwnd;
MyClass() {
hwnd = OpenHandle();
}
~MyClass() {
CloseHandle( hwnd );
}
};
Faire vector<MyClass> vec;
for( i=0; i<10; ++i) { vec.push_back( MyClass() );
}
ne fonctionne pas car le handle est fermé tout de suite.
En fait, comme on l'a dit, pour pouvoir mettre une classe dans un
vector, elle DOIT pouvoir être copiée (avec la sémentique du mot
copier). Ce n'est pas le cas de cette classe. Dans cet example
windowsien, un truc qui ressemble à ça devrait marcher :
MyClass::MyClass(MyClass const &mc)
{
DuplicateHandle(GetCurrentProcess(), mc.hwnd, GetCurrentProcess(), hwn d);
}
struct MyClass { HANDLE hwnd; MyClass() { hwnd = OpenHandle(); } ~MyClass() { CloseHandle( hwnd ); } }; Faire vector<MyClass> vec; for( i=0; i<10; ++i) { vec.push_back( MyClass() ); } ne fonctionne pas car le handle est fermé tout de suite.
En fait, comme on l'a dit, pour pouvoir mettre une classe dans un vector, elle DOIT pouvoir être copiée (avec la sémentique du mot copier). Ce n'est pas le cas de cette classe. Dans cet example windowsien, un truc qui ressemble à ça devrait marcher :
MyClass::MyClass(MyClass const &mc) { DuplicateHandle(GetCurrentProcess(), mc.hwnd, GetCurrentProcess(), hwn d); }