2010-01-19 50 views
2

我深化發展成像庫和我正在與該圖像數據的數據類型什麼數據類型用於圖像數據以避免std:bad_alloc?

掙扎由於圖像可以具有可變的數據類型(每像素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

現在我必須同意這一空白*不會直接導致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

+0

當您撥打新電話時,您正在操作的圖像的大小是多少? (什麼是'size_x,size_y'?) – GManNickG 2010-01-19 03:01:01

+2

我們可以看到CImage的構造函數嗎? – 2010-01-19 04:19:45

回答

1

bad_alloc可能意味着你沒有空閒的內存(因爲你說sizeof(CImage)== 28,你很可能會在一個緊密或無限循環)。它也可能意味着你已經損壞了freestore,雖然以前的頑皮內存行爲並且它在下一個分配/釋放週期中被捕獲。一個良好的調試會話可以幫助區分差異。

+0

接受已損壞的freestore。我在其他地方覆蓋了內存,只是有時候新的內存會把它全部殺死 – Eric 2010-01-19 22:41:29

2

當新拋出bad_alloc的,這意味着它無法分配請求的大小。造成這種情況的常見原因是使用的垃圾值比預期的要大得多。 (也可能真的耗盡內存。)但是,對於您的代碼,無論是sizeof(CImage)是真的很大或bad_alloc從其他一些新的表達式中拋出。

它看起來像你想要一個構造函數而不是create_image,並且可能派生類(每個圖像類型一個),而不是存儲data_type。

+0

sizeof(CImage)== 28 – Eric 2010-01-19 03:31:07

2

如果你需要一個帶有變量BPP的原始數據的緩衝區,可以考慮使用一個unsigned char的數組。封裝類中的訪問--CImage應該包含一個在構造時分配的數組。更好的是,使用std::vector

相關問題