【问题标题】:What datatype to use for image data to avoid std:bad_alloc?图像数据使用什么数据类型来避免 std:bad_alloc?
【发布时间】:2011-01-06 15:20:53
【问题描述】:

我正在开发一个图像库,但我正在努力处理图像数据数据类型

由于图像可以具有可变数据类型(每像素 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;

   }

尺寸为 x:746, y:325

【问题讨论】:

  • 调用 new 时,您正在操作的图像的大小是多少? (size_x, size_y 是什么?)
  • 我们能看到 CImage 的构造函数吗?

标签: c++ image pointers void types


【解决方案1】:

bad_alloc 可能意味着您的可用内存不足(因为您说 sizeof(CImage) == 28,您很可能会在紧密或无限循环中执行此操作)。这也可能意味着您已经通过以前的顽皮内存行为破坏了 freestore,并且它只是在下一个分配/释放周期中捕获了它。一个好的调试会话可以帮助区分。

【讨论】:

  • 已接受损坏的免费存储。我在其他地方覆盖了内存,只有有时新的会杀死它
【解决方案2】:

如果您需要一个带有可变 BPP 的原始数据缓冲区,请考虑仅使用 unsigned char 的数组。将访问封装在一个类中——CImage 应该包含一个它在构造时分配的数组。更好的是,使用std::vector

【讨论】:

    【解决方案3】:

    当 new 抛出 bad_alloc 时,这意味着它无法分配请求的大小。造成这种情况的常见原因是使用了比预期大得多的垃圾值。 (实际上也有可能内存不足。)但是,对于您的代码,sizeof(CImage) 真的很大 或者 bad_alloc 是从其他一些新表达式中抛出的。

    看起来您想要一个构造函数而不是 create_image,并且可能需要一个带有工厂而不是存储 data_type 的派生类(每个图像类型一个)。

    【讨论】:

      猜你喜欢
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 2012-01-30
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多