2

画像ライブラリを開発していて、画像データデータ型に苦労しています

画像は可変のデータ型(ピクセルあたり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です

4

3 に答える 3

2

newがbad_allocをスローすると、要求されたサイズを割り当てることができなかったことを意味します。その一般的な原因は、意図したよりもはるかに大きいガベージ値を使用していることです。(実際にメモリが不足する可能性もあります。)ただし、コードの場合、sizeof(CImage)が非常に大きいか、他の新しい式からbad_allocがスローされています。

create_imageではなくコンストラクターが必要なようです。data_typeを格納する代わりに、ファクトリを使用して派生クラス(画像タイプごとに1つ)を使用することもできます。

于 2010-01-19T03:12:49.140 に答える
2

変数BPPを持つ生データ用のバッファーが必要な場合は、の配列を使用することを検討してunsigned charください。クラス内にアクセスをカプセル化します。CImageには、構築時に割り当てる配列が含まれている必要があります。さらに良いことに、を使用しstd::vectorます。

于 2010-01-19T03:15:21.257 に答える
1

bad_allocは、空きメモリが不足していることを意味する場合があります(sizeof(CImage)== 28と言うので、タイトループまたは無限ループで実行している可能性があります)。また、以前のいたずらなメモリ動作によってフリーストアが破損し、次の割り当て/リリースサイクルでそれをキャッチしたことを意味する場合もあります。優れたデバッグセッションは、違いを見分けるのに役立ちます。

于 2010-01-19T03:50:00.413 に答える