代码之家  ›  专栏  ›  技术社区  ›  Eric

为避免std:bad_alloc,图像数据使用什么数据类型?

  •  2
  • Eric  · 技术社区  · 15 年前

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

    因为图像可以有可变的数据类型(每像素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

    现在我必须承认,虚空并不会直接导致糟糕的分配,但我很肯定这里有问题。有什么暗示吗?

    编辑:

    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 回复  |  直到 15 年前
        1
  •  1
  •   Todd Gardner    15 年前

    bad_alloc可能意味着您的可用内存不足(因为您说sizeof(cimage)==28,所以您很可能是在一个紧循环或无限循环中完成的)。这也可能意味着您已经破坏了freestore,尽管以前的内存行为很顽皮,但它只是在下一个分配/释放周期捕获到它。一个好的调试会话有助于区别。

        2
  •  2
  •   Roger Pate    15 年前

    当new抛出bad_alloc时,这意味着它无法分配请求的大小。常见的原因是使用的垃圾值远远大于预期值。(实际上也可能会耗尽内存。)对于代码,sizeof(cimage)是 真巨大 或者bad_alloc是从其他新表达式抛出的。

    看起来您需要一个构造函数而不是创建映像,还可能需要一个带有工厂的派生类(每个映像类型一个),而不是存储数据类型。

        3
  •  2
  •   rlbond    15 年前

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