Sobrecarga operador new de una clase en C++

No he encontrado nada que me logre quitar una duda sobre este operador.

Es posible sobrecargar new como cualquier otro operador, pero sólo he visto que se pueda acceder a los parámetros referentes al tamaño de memoria a reservar y al pool en la memoria opcionalmente (ahora no estoy hablando de new[]). Me gustaría saber si existiría algún modo de acceder a los parámetros que posteriormente se le van a pasar al constructor de la clase.

Lo necesito porque me resultaría muy interesante hacer allí algunas comprobaciones antes de reservar la memoria. Estoy haciendo una biblioteca y esta clase de objeto tiene conteo de referencias. Si pudiese hacer algo así, sería muy transparente y cómodo para el usuario.
Segun sé, no.

Has probado boost::shared_ptr?
No me sirve, obliga al usuario de mi biblioteca a usar un tipo "extraño". Y sobre la sobrecarga del new..... no, he estado varios días indagando por internet, y no se puede hacer lo que yo quiero :(. Está especificado en el estándar que el constructor siempre se llame después del new.

Todo esto es por lo siguiente, a ver si planteándolo alguien me da una solución.Yo hago una biblioteca. Ofrezco al usuario algunos objetos cuya memoria administro yo a través de un contador de referencias. Con esto no hay problemas, hago que el constructor y el destructor sean privados, obligando al usuario a usar mis métodos administradores y punto. Pero también ofrezco una clase base, con una administración similar, cuyos objetos serán creados por el usuario en forma de clases derivadas. Como la implementación de la clase derivada es por cuenta del usuario, no puedo obligarle a que no libere la memoria explícitamente, es decir a que declare su destructor como privado. Como mucho puedo causar errores de ejecución al ejecutarse el destructor de la clase base, pero eso es una chapuza, yo quiero esos errores en compilación.
Elelegido escribió:Pero también ofrezco una clase base, con una administración similar, cuyos objetos serán creados por el usuario en forma de clases derivadas. Como la implementación de la clase derivada es por cuenta del usuario, no puedo obligarle a que no libere la memoria explícitamente, es decir a que declare su destructor como privado. Como mucho puedo causar errores de ejecución al ejecutarse el destructor de la clase base, pero eso es una chapuza, yo quiero esos errores en compilación.


En ese caso IMHO, la responsabilidad de la correcta implementación es del usuario, con lo que en definitiva "no es tu problema". Simplemente documenta el uso de dicha clase base correctamente.

Otra posibilidad es crear tu propio smart pointer que se encargue de actualizar el conteo de referencias aunque implique usar un tipo extraño.
3 respuestas