Franny's Adobe

Il blog di Francesco Carucci
posts - 99, comments - 612, trackbacks - 937

Resource Acquisition is Initialisation

http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization

CWaterRenderingStrategy::~CWaterRenderingStrategy()
{
  delete m_Geometry;
  delete m_Shader;
}

e poi subito dopo:

COceanRenderingStrategy::~COceanRenderingStrategy()
{
  delete m_Geometry;
}

Boom. Double delete e memory corruption. Qualcuno ha perso due ore per cercarlo. Il mio errore e' stato non seguire il pattern RAII e rilasciare m_Geometry nella classe base, ma la classe base non l'aveva inizializzato quindi non ne aveva l'ownership e non doveva cancellarlo. Nella classe derivata ho correttamente costruito e distrutto l'oggetto, ma l'ho scritta mesi dopo.

Per altro... uno strategy pattern in questa situazione era overingegnerizzato. Non mi serviva ed ha offuscato il bug. Altra lezione.

 

 

Print | posted on venerdì 21 settembre 2007 17.54 | Filed Under [ Programming ]

Feedback

Gravatar

# re: Resource Acquisition is Initialisation

Non puoi usare qualche smart pointer personalizzato o semplicemente shared_ptr?
28/09/2007 22.59 | Federico

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 7 and 2 and type the answer here:

Powered by: