Normalmente no, ya que no se usa a menudo. Pero podría ser necesario, ya que cuando sobrecarga operator new
en una clase, oculta todas las sobrecargas del ::operator new
global.
Por lo tanto, si desea utilizar la ubicación nueva en objetos de esa clase, haga; de lo contrario, no. Lo mismo ocurre con nothrow
nuevo.
Si acabas de cambiar el esquema de asignación, y te sorprende que alguien esté utilizando la ubicación nueva a tus espaldas, eso podría ser algo para investigar antes de aplicar esta curita.
Si la clase se utiliza dentro de contenedores de biblioteca estándar, no directamente con new
, el esquema de asignación personalizada debe definirse mediante una clase de asignador, no una sobrecarga. El asignador predeterminado std::allocator
no respeta las sobrecargas del miembro operator new
, pero las omite. Vea abajo.
Negación: Clase-alcance operator new
sobrecargas son útiles principalmente para la depuración, e incluso entonces es difícil de conseguir de forma fiable la semántica significativas. Cuidado:
Es necesario también sobrecargue operator delete
. (No se hace en el ejemplo en esta pregunta.)
Las sobrecargas se sostendrán por la sintaxis calificada ::new T
. Usted no puede evitar tal desvío. Esta es la forma en que std::allocator<T>
asigna cosas. Puedes especializarte en std::allocator
para tus tipos, pero eso ya está dentro de la madriguera.
Para cada ::operator new
sobrecarga introducida por cualquier biblioteca, incluyendo la colocación canónica nueva de <new>
, tendrá que considerar si se aplica a su clase y decidir si desea añadir una sobrecarga, o de otra forma lidiar con el fracaso de no calificado new
expresiones.
Para cada ::operator new
que adopte en su clase, debe proporcionar la ubicación de miembro correspondiente operator delete
con la semántica correcta. Esto se llama en caso de que el constructor salga por excepción. Si no se tiene, se produciría una pérdida de memoria solo en circunstancias muy específicas, en un grupo de recursos posiblemente restringido.
En resumen, miembro de operator new
es la antítesis de codificación defensiva.
En realidad es una buena idea implementar placement y nothrow 'new' cada vez que implemente' nuevo' personalizado por esta misma razón. Podría romper el código existente al no proporcionar las seis versiones de nuevo y eliminar (no olvide formularios de matriz). –
la colocación 'new' no se usa a menudo en el código, pero los contenedores STL frecuentemente lo usan para separar su asignación de memoria de la construcción de objetos. –
@Philip: Esa es una bandera roja, dado que 'std :: allocator' obtiene su memoria de' :: operator new'. En ese caso, la solución es implementar un asignador personalizado, no para habilitar el estándar. – Potatoswatter