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