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

StackOverflow https://stackoverflow.com/questions/2090754

Вопрос

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

Поскольку изображения могут иметь переменные типы данных (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, но я почти уверен, что здесь что-то не так.Есть какие-нибудь подсказки?

РЕДАКТИРОВАТЬ:

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;

   }

размеры х:746, у:325

Это было полезно?

Решение

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top