Я новичок в C++. У меня проблема с обработкой изображений. То, что я пытаюсь сделать, - написать мой класс Image, который имеет в качестве частных переменных горизонтальные и вертикальные размеры изображения и данных для каждого пикселя (полутоновый, только 2D-массив поплавков). Я также написал основные функции внутри класса: getPixel, SetPixel, GetSize, GetData (возвращает 2D-массив данных).Деструктор и перегруженный = оператор для класса изображения
Мой вопрос: Я читал, что для лучшей производительности я должен написать функцию деструктора и перегрузить оператор «=» как минимум.
1) Может кто-нибудь объяснить, почему мне это действительно нужно (до тех пор, пока эта версия работает более или менее).
2) Можете ли вы написать деструктор и оператор «=» для меня? Я думаю, это не сложно для экспертов, я пытался один раз, но с моим деструктором у меня были ошибки памяти: Ошибка _BLOCK_TYPE_IS_VALID (pHead-> nBlockUse);
Обновление: Даже сейчас, без определения оператора «=», я могу использовать его в своей основной функции. Если, скажем, у меня был Image img1 размера (1x1) и img2 размера (2x2), я могу написать img1 = img2, и он работает!
Update2: После того, как я пытался реализовать простой деструктор (удалить [] пикс) ошибка "_BLOCK_TYPE_IS_VALID" появился
struct Pixel
{
float p;
};
struct size
{
int x;
int y;
};
class Image {
private:
int _x, _y;
Pixel *pix;
public:
Image(int x, int y){
pix = new Pixel[x * y];
_x = x;
_y = y;
}
float getPixel(int i, int j) {
return pix[i * _y + j].p;
}
void setPixel(int i, int j, Pixel val)
{
pix[i * _y + j].p = val.p;
}
size GetSize(){
size a;
a.x = _x;
a.y = _y;
return a;
}
Pixel **GetData(){
Pixel **a=0;
a = new Pixel*[_x];
for (int i = 0; i < _x; i++){
a[i] = new Pixel[_y];
for (int j = 0; j < _y; j++){
a[i][j] = pix[i*_y + j];
}
}
return a;
}
};
UPDDATE 3: Я пытался реализовать все из правила трех. Я добавил:
~Image()
{
delete[] pix;
}
Image(const Image& that)
{
pix = new Pixel[that._x*that._y];
pix = that.pix;
_x = that._x;
_y = that._y;
}
Image& operator=(const Image& that)
{
if (this != &that)
{
delete[] pix;
pix = new Pixel[that._x*that._y];
pix = that.pix;
_x = that._x;
_y = that._y;
}
return *this;
}
Еще есть ошибка памяти: "_BLOCK_TYPE_IS_VALID ..."
Используйте 'зОго :: вектора' вместо 'Pixel *' 'для pix' и вам тоже не нужно писать. –
Но это работает. Почему вектор лучше? –
Mihon
Потому что 'std :: vector' будет управлять памятью для вас, и вам не нужно беспокоиться об удалении, изменении размера, распределении новых буферов при создании копии и т. Д. –