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.