Какой тип данных использовать для данных изображения, чтобы избежать std: bad_alloc? - PullRequest
2 голосов
/ 19 января 2010

Я разрабатываю библиотеку изображений и борюсь с типом данных изображения

Поскольку изображения могут иметь переменные типы данных (8 бит на пиксель, 16 бит на пиксель), я подумал о реализации указателя данных моего изображения на

void* pimage_data;

однако void * приводит ко всем видам гадости, включая арифметику уродливых указателей, таких как

pimage_data = &((unsigned char*)pimage_parent->m_pdata)[offset_y * pimage_parent->m_pitch + offset_x];

Я подозреваю, что с этим что-то не так, поскольку, когда я передаю его другому методу,

CImage* roi = CImage::create_image(size_x, size_y, pimage_parent->m_data_type, pimage_data);

CImage* CImage::create_image(int size_x, int size_y, E_DATA_TYPE data_type, void* pimage)
   {
   assert(size_x > 0);
   assert(size_y > 0);

   CImage* image = new CImage(size_x, size_y, data_type);
   image->m_pdata = pimage;

   return image;

   }

новый возврат std::bad_alloc

Теперь я должен согласиться с тем, что void * не ведет непосредственно к bad_alloc, но я уверен, что здесь что-то не так. Есть намеки?

EDIT:

CImage почти ничего не делает

CImage::CImage(int size_x, int size_y, E_DATA_TYPE data_type)
   {

   assert(size_x > 0);
   assert(size_y > 0);

   // Copy of the parameter to the class members
   this->m_size_x = size_x;
   this->m_size_y = size_y;
   this->m_data_type = data_type;
   this->m_pitch = size_x;

   // The ctor simply create a standalone image for now
   this->m_pimage_child = NULL;
   this->m_pimage_parent = NULL;

   }

Размеры x: 746, y: 325

Ответы [ 3 ]

2 голосов
/ 19 января 2010

Если вам нужен буфер для необработанных данных с переменной BPP, рассмотрите возможность использования массива unsigned char. Инкапсулируйте доступ внутри класса - CImage должен содержать массив, который он выделяет при создании. А еще лучше использовать std::vector.

2 голосов
/ 19 января 2010

Когда new выбрасывает bad_alloc, это означает, что он не может выделить запрошенный размер. Распространенной причиной этого является использование значений мусора, которые намного больше, чем предполагалось. (На самом деле возможно и нехватка памяти.) Однако для вашего кода либо sizeof (CImage) действительно огромен , либо bad_alloc выбрасывается из некоторого другого нового выражения.

Похоже, вам нужен конструктор, а не create_image и, возможно, производные классы (по одному для каждого типа изображения) с фабрикой вместо хранения data_type.

1 голос
/ 19 января 2010

bad_alloc может означать, что у вас недостаточно свободной памяти (поскольку вы говорите sizeof (CImage) == 28, вы, скорее всего, будете делать это в тесном или бесконечном цикле).Это также может означать, что вы повредили бесплатное хранилище из-за предыдущего непослушного поведения памяти, и оно просто перехватило его в следующем цикле выделения / выпуска.Хорошая сессия отладки может помочь понять разницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...