Certaines personnes ont préconisé le placement nouveau. C'est dangereux, et jusqu'à présent, deux exemples d'utilisation ont omis des détails cruciaux comme l'en-tête <new>
, qualifiant l'appel comme ::new ...
, et comment nettoyer.
La solution sûre consiste à définir des fonctions d'allocation et de désallocation personnalisées pour votre classe ou pour une classe dérivée de votre classe. L'exemple ci-dessous montre le dernier. Notez que le destructeur virtuel est uniquement là pour prendre en charge la dérivation de classe; si vous ne dérivez pas, vous n'en avez pas besoin.
#include <stddef.h>
#include <iostream>
void* some_allocator_im_forced_to_use(size_t size)
{
std::cout << "Allocated " << size << " bytes." << std::endl;
return ::operator new(size);
}
void some_deallocator_im_forced_to_use(void* p, size_t size)
{
std::cout << "Deallocated " << size << " bytes." << std::endl;
::operator delete(p);
}
struct A
{
int x_;
A(): x_(42) {}
virtual ~A() {}
};
struct CustomAllocedA
: A
{
void* operator new(size_t size)
{
return some_allocator_im_forced_to_use(size);
}
void operator delete(void* p, size_t size)
{
some_deallocator_im_forced_to_use(p, size);
}
};
int main()
{
A* const p = new CustomAllocedA;
std::cout << p->x_ << std::endl;
delete p;
}
Important: bien que ce soit « sûr » en lui-même, et bien que cet exemple est sûr, la sécurité pour votre code repose finalement sur votre commande allocateur retourner un pointeur vers la mémoire correctement aligné.
Vive & HTH.,
+1 remplacant nouvel opérateur est tout à fait une bien meilleure idée que d'utiliser le placement nouveau. –