2009-11-18 78 views
0

我的C++/openGL程序有問題。運算符分配數組時遇到的問題

在代碼的一些點,像這樣的(這是一個構造函數):

MyObject(MyMesh * m, MyTexture* t, float *c=NULL, float *sr=NULL, int sh=100){ 
texture=t; 
mesh=m; 
subObjects=NULL; 
texCoords=NULL; 
if (texture!=NULL){ 
     texCoords=new float[mesh->numSurfacePoints*2]; 

新拋出的std :: bad_alloc異常。在另一個地方是一樣的。 是否有可能,我用完了內存?我不這麼認爲,所以如果你能幫助我,我會很高興! 再見!

+5

mesh-> numSurfacePoints的值是多少? – 2009-11-18 15:33:35

+0

你知道numSurfacePoints有多少點嗎? – 2009-11-18 15:34:02

+0

是否有可能將網格作爲null傳入? – ChadNC 2009-11-18 15:51:07

回答

0

您是否在某處調用texCoords上的delete []?這看起來好像你的內存不足了。

+0

不,我不這樣做,因爲我使用它們直到程序退出。 – 2009-11-18 15:45:27

2

您還應該檢查mesh->numSurfacePoints的值,也許它是假的或消極的,也可能是錯誤的根源。

+0

它沒問題。指定問題:我有一個MyMesh類,可以鑲嵌N個圓錐體和金字塔。它也可以產生空心圓錐體,在這種情況下,通過圓錐體形成一個孔。如果我生成一個空心圓錐體,沒關係,即使我使用20個圓錐體,但是我生成一個不空心的圓錐體,它會生成MyMesh,但是當我將它傳遞給MyObject構造函數時,會引發錯誤。 – 2009-11-18 15:48:39

2

是否有可能,我用完了內存?

當拋出std::bad_alloc時,程序使用多少內存?

mesh->numSurfacePoints崩潰時的值是多少?你確定傳入的指針是mesh是一個有效的指針嗎?如果地址空間非常分散,則可能沒有足夠的連續空間來分配大型數組。您的程序在拋出std::bad_alloc之前運行了多長時間?

如果您還不是,那麼您應該考慮使用boost::scoped_array或其他形式的智能指針,以便在不再需要堆分配對象時自動刪除。

+0

不幸的是,這個程序必須在我的大學的服務器上運行,所以我不能使用智能指針。 thu numSurfacePoints是36,但它運行良好,數量更多(請參閱我對Steffen的回覆的評論)。我該如何檢查程序使用的內存,當它崩潰時? – 2009-11-18 16:01:19

+1

這取決於操作系統。但是,很可能您的內存使用量受到大學服務器上的配額限制,如果您擁有完整的地址空間,則可能會導致內存耗盡_much_的速度比您通常會更快。 – 2009-11-18 16:06:47

1

實際上,在現代操作系統下,內存耗盡的可能性不大。在你這樣做之前,機器會交換太多,以至於它變得或多或少不可用 - 你不能錯過。另外,當我幾年前對Win2k進行實驗時,發現當我的測試應用程序分配儘可能多的內存時,每個應用程序都會崩潰。 (包括調試器,辦公應用程序,瀏覽器,電子郵件應用程序,甚至記事本)。

所以我會假設你要麼分配一個不合理的大數量,要麼堆變得很碎,甚至不能滿足合理的要求。

如何編寫代碼是這樣的:

// for example 
const std::size_t arbitrary_max_size_constant = std::vector<float>::max_size(); 
// or std::nummeric_traits<std::size_T>.max()/10; 

if (texture!=NULL){ 
    assert(mesh->numSurfacePoints < arbitrary_max_size_constant); 
    texCoords = new float[mesh->numSurfacePoints*2]; 
    // ... 
} 

這會提醒你在調試作案,如果你的程序有錯誤,但不會放慢發行代碼。另一種可能性是,你捕獲該異常並打印程序試圖分配內存:

if (texture!=NULL) { 
    try { 
    texCoords = new float[mesh->numSurfacePoints*2]; 
    } catch(const std::bad_alloc& x) { 
    std::cerr << "failed to allocate << mesh->numSurfacePoints*2 << " bytes!\n"; 
    throw; 
    } 
    // ... 
} 

這種方式,你還會看到值是否是不合理的大。如果是的話,你會得到一個bug,如果沒有,你的內存不足,或者堆太碎,無法分配程序在這個地方需要的數量。

+0

謝謝,但它似乎沒關係。只嘗試分配36個浮點數,所以它不應該是一個問題。如果沒有其他猜測,那麼我將開始從開始調試...呃...祝我好運:) – 2009-11-18 16:34:38

+0

你是如何發現有關35? – sbi 2009-11-18 16:50:42