Pourquoi les non-placement new
expression et le delete
expression implémentées en tant que fonctions intégrées au langage au lieu de fonctions ordinaires ?
Si nous avons...
-
un moyen de demander/recevoir de la mémoire au système d'exploitation.
-
une façon d'invoquer explicitement un constructeur (placement
new
) -
un moyen d'invoquer explicitement un destructeur (
~T()
)
...pourquoi le non-placement ne pourrait-il pas new
et delete
simplement des fonctions ordinaires de la bibliothèque standard ? Exemple :
template <typename T, typename... Ts>
T* library_new(Ts&&... xs)
{
auto* ptr = /* request enough memory for `T` from OS */;
new (ptr) T(std::forward<Ts>(xs)...);
return ptr;
}
template <typename T>
void library_delete(T* ptr)
{
ptr->~T();
/* reclaim memory for `T` from OS */
}