Ver Mensaje Individual
  #3 (permalink)  
Antiguo 17/05/2008, 12:28
felmoltor
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con Heap

La verdad es que es algo más complicado de lo que he puesto ahí.
Guardo más campos y estan relacionados en su creación unos con otros.

Intentaré resumir el código:

RGBPixel.h:

Código:
#include <iostream>

using namespace std;

class RGBLPixel
{
     public:
	  RGBLPixel();
	  RGBLPixel(unsigned char _red,unsigned char _green,unsigned char _blue);
	  virtual ~RGBLPixel();
     private:
	  unsigned char m_r;
	  unsigned char m_g;
	  unsigned char m_b;
};
RGBPixel.cpp:

Código:
#include "RGBPixel.h"

RGBLPixel::RGBLPixel()
{
    m_r = 0;
    m_g = 0;
    m_b = 0;
}

RGBLPixel::RGBLPixel(unsigned char _red,unsigned char _green,unsigned char _blue)
{
     	m_r = _red;
	m_g = _green;
	m_b = _blue;
}

RGBLPixel::~RGBLPixel()
{
         m_r = 0;
	 m_g = 0;
	 m_b = 0;
}
PixelGroup.h:

Código:
#include "RGBPixel.h"

class PixelGroup
{
     public:
	  PixelGroup();
	  void setNumClusters(int _nClusters);
	  void setNumPixels(int _n);
	  virtual ~PixelGroup();
     private:
	  int m_numPixels;
	  RGBLPixel * m_grupo;
	  int m_numClusters;
	  float ** m_pertenencias;
};
PixelGroup.cpp:

Código:
#include "PixelGroup.h"

PixelGroup::PixelGroup()
{
	m_numPixels = 0;
	m_numClusters = 0;
	m_grupo = NULL;
	m_pertenencias = NULL;
}

/*******************************************************************/

void PixelGroup::setNumClusters(int _nClusters)
{
	if (m_pertenencias != NULL)
	{
		for (int i=0;i<m_numClusters;i++)
			delete [] m_pertenencias[i];
		delete [] m_pertenencias;
		m_pertenencias = NULL;
	}		
	if (m_numPixels >0)
	{
		m_numClusters = _nClusters;
		m_pertenencias = new float * [m_numClusters];
		for (int i=0;i<m_numClusters;i++)
		{
			m_pertenencias[i] = new float [m_numPixels];
			memset(m_pertenencias[i],0,sizeof(float)*m_numPixels);
		}
	}
	else
	{
		m_numClusters = _nClusters;
	}
}

/*******************************************************************/

void PixelGroup::setNumPixels(int _n)
{
	if (m_grupo != NULL)
		delete [] m_grupo;
	m_numPixels = _n;
	m_grupo = new RGBLPixel [m_numPixels];
	memset(m_grupo,0,m_numPixels*sizeof(RGBLPixel));
	//si todavía no hemos creado la matriz de subpertenencias
	if (m_pertenencias == NULL && m_numClusters > 0)
	{
		m_pertenencias = new float * [m_numClusters];
		for (int i=0;i<m_numClusters;i++)
		{
			m_pertenencias[i] = new float [m_numPixels];
			memset(m_pertenencias[i],0,sizeof(float)*m_numPixels);
		}
	}
	
}

/*******************************************************************/

PixelGroup::~PixelGroup()
{
	if (m_pertenencias != NULL)
	{
		for (int i=0;i<m_numClusters;i++)
		{
			delete [] m_pertenencias[i];
		}
		delete [] m_pertenencias;
		m_pertenencias = NULL;
	}
	if (m_grupo != NULL)
	{
		delete [] m_grupo;
		m_grupo = NULL;
	}
	m_numClusters = 0;
	m_numPixels = 0;
}
prueba.cpp:

Código:
#include "PixelGroup.h"

using namespace std;

int main()
{
	PixelGroup pg;
	pg.setNumClusters(3);
	pg.setNumPixels(10);
	
	cout<<"Ahora va a haber un fallo de segmentacion"<<endl;
}
Ejecuta:
Código:
g++ -c RGBPixel.cpp
g++ -c PixelGroup.cpp
g++ -o prueba prueba.cpp RGBPixel.o PixelGroup.o
El vector m_pertenencias y m_grupo estan relacionados entre sí y compruebo que qué numero se ha especificado antes para crear los vectores de acuerdo al orden en que se han llamado a las funciones setNumPixels y setNumClusters.
En el destructor compruebo que sean diferentes de nulos para hacer los deletes en consecuencia. Este programa solo funciona cuando comento todos los deletes.

Muchas gracias por la ayuda.