ما نوع البيانات لاستخدامها في بيانات الصورة لتجنب STD: BAD_ALLOC؟

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

سؤال

أقوم بتطوير مكتبة تصوير وأنا أواجه نوع بيانات بيانات الصور

نظرًا لأن الصور يمكن أن تحتوي على أنواع بيانات متغيرة (8 بت لكل بكسل ، 16 بت لكل بكسل) فكرت في تنفيذ مؤشر بيانات الصورة الخاص بي

void* pimage_data;

ومع ذلك ، يؤدي باطل* إلى كل أنواع الفقدان بما في ذلك الحساب القبيح مثل

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;

   }

الأحجام x: 746 ، y: 325

هل كانت مفيدة؟

المحلول

يمكن أن تعني BAD_ALLOC أنك خارج الذاكرة الحرة (بما أنك تقول حجم (cimage) == 28 ، من المرجح أن تفعل ذلك في حلقة ضيقة أو لا حصر لها). يمكن أن يعني أيضًا أنك قد أفسدت FreeStore على الرغم من سلوك الذاكرة المشاغب السابق وقد اكتشفه في دورة التخصيص/الإصدار التالية. يمكن أن تساعد جلسة تصحيح الأخطاء الجيدة في تحديد الفرق.

نصائح أخرى

عندما يلقي New Bad_alloc ، فهذا يعني أنه لا يمكن تخصيص الحجم المطلوب. السبب الشائع لذلك هو استخدام قيم القمامة التي تكون أكبر بكثير من المقصود. (من الممكن أن تنفد بالفعل من الذاكرة أيضًا.) بالنسبة إلى الكود الخاص بك ، ومع ذلك ، إما حجم (cimage) ضخمة حقا أو يتم إلقاء bad_alloc من بعض التعبير الجديد.

يبدو أنك تريد مُنشئًا بدلاً من Create_image ، وربما فئات مشتقة (واحدة لكل نوع صورة) مع مصنع بدلاً من تخزين Data_type.

إذا كنت بحاجة إلى مخزن مؤقت للبيانات الأولية مع متغير BPP ، ففكر فقط في استخدام مجموعة من unsigned char. تغليف الوصول داخل الفصل - يجب أن يحتوي cimage على صفيف يخصصه للبناء. الأفضل من ذلك ، استخدم أ std::vector.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top