Это длинный.У меня есть функция, которая загружает некоторые данные изображения с диска.Я пробовал это с тремя различными методами, один из которых не работает, и мне интересно, какой самый умный метод.
Метод 1:
Я имел обыкновение его устанавливатьтак, чтобы загруженные данные были аргументом функции, которая, казалось, требовала выделить пространство для нее вне функции, а затем передать указатель на выделенное пространство.Это требует знания размера изображения заранее, поэтому необходимо было сделать вспомогательную функцию, чтобы сначала получить ширину и высоту изображения.Ниже приведен пример.
Плюсы: в коде вызова более четко указано, что память выделяется и поэтому должна быть удалена.
Минусы: нужно заранее знать размер изображения.
// Data allocated outside the image, allocated space passed to function. This works.
// Notice that width & height are passed to the function.
size=(*width)*(*height);
image = new unsigned char[size];
void read_pgm(unsigned char *image, char *file_name, int width, int height){
// Code to read sizeof(char)*width*height bytes of data from the file into image
}
Метод 2:
Я подумал, что было бы неплохо, чтобы функция распределяла свои собственные данные так,Мне не нужно передавать его размер.Если бы я попытался выделить для него место в функции, оно, похоже, было потеряно после завершения функции.В следующем случае функция read_pgm
работает нормально, но если я затем пытаюсь записать эти данные в другой файл, мой код вылетает.
Плюсы: не нужно заранее знать размер изображения,нет необходимости выделять данные в вызывающем коде.
Минусы: не работает.Кроме того, если это произойдет, будет ли повторный вызов в цикле приводить к утечке памяти, если я не очищаю изображение вне функции?
// Data allocated inside the image for a pointer passed to the function. This doesn't work.
void read_pgm(unsigned char *image, char *file_name, int *width, int *height){
size=(*width)*(*height);
image = new unsigned char[size];
// Code to read the data from the file into image
}
Метод 3:
Здесьданные снова размещаются в функции, но возвращаются как возвращаемый элемент.Это работает, то есть я могу записать данные в другое изображение в порядке.Я не понимаю, почему это работает, а метод 2 - нет.
Плюсы: те же, что и в методе 2.
Минусы: те же, что и в методе 2, за исключением того, что в настоящее время это работает.
// Data allocated in the function, and returned. This works.
unsigned char* read_pgm(char *file_name, int *width, int *height){
// Allocate data for the image
size=(*width)*(*height);
image = new unsigned char[size];
// Code to read the data from the file into image
return image; // Return pointer to the data
}
Итак, мои вопросы:
В таком случае разумнее настроить функцию так, чтобы она сама выделяла пространство, чтобы вызывающий код нене нужно предоставить размер изображения?Или же разумнее выделить вне функции в качестве напоминания, что удаление должно быть вызвано на изображении в какой-то момент.Или я ошибаюсь, думая, что это нужно сделать?Кажется, что вызов метода 2 или метода 3 в цикле приведет к утечке памяти.
Почему не работает метод 2?
Спасибо.