Ver Mensaje Individual
  #8  
Antiguo 23-02-2024
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Reputación: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
En C++ puedes crear un objeto directamente con el constructor (función de nombre igual al de la clase) o indirectamente con el operador new + el constructor. En la primera forma el objeto vive lo que dure su ámbito, en la segunda vive hasta que uses delete.
El las clases de la VCL debes usar el operador new por exigencia de la VCL. Aunque funcione la cración directa de TResourceStream con versiones de Builder (en Berlin funciona) no es la forma apropiada y la ayuda te indica que debes crearlo de forma indirecta.


No se porqué tienes esa idea de no destruir el puntero, ten en cuenta que cada instancia que usas es un objeto diferente que se va a destruir sola, si usas la forma directa o con delete si usas la indirecta.

Existe una forma de que el puntero se autodestruya con los punteros inteligentes: auto_ptr, pero el puntero se destruirá de igual forma tras el uso de cada instancia.


Si lo que pretendes es usar auto_ptr, aquí tienen un esquema:
Código:
#include <memory>


...........
if(!FileExists(RAR))
  std::auto_ptr <TResourceStream> (new TResourceStream(0, L"C", RT_RCDATA))->SaveToFile(RAR);
if(!FileExists(IMG))
  std::auto_ptr <TResourceStream> (new TResourceStream(0, L"R", RT_RCDATA))->SaveToFile(IMG);

Usa Templates en lugar de una función como te puse arriba que quizás es más fácil de entender. Eso significa que el compilador expande el código del template a cada llamada.


Saludos.
Responder Con Cita