Franny's Adobe

Il blog di Francesco Carucci
posts - 99, comments - 948, trackbacks - 6705

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 20:54 | Filed Under [ Programming ]

Powered by:
Powered By Subtext Powered By ASP.NET