2014-06-30 62 views
1

我需要爲QImage數組動態分配內存。QImage數組的動態分配

它爲我在Linux中:

void Arrange_Images(int numOfCams, int numBoards) 
{ 
    QImage * array_of_images[numOfCams*numOfBoards]; 
    . 
    . 
    . 
} 

但Windows將不解決此問題,並且將其標記爲錯誤。 對於標準數組,我可以使用malloc,但這是一個QImage數組。 之後,每個單元格將被圖像填充以進行重新排序和進一步處理。 感謝您的幫助。

+0

粘貼錯誤消息。 – KjMag

+0

一些建議:1.上面不是'QImage'數組,它是'Qimage'的指針數組*。 2.你不應該在C++中使用'malloc'。 3.對於原始內存管理,你應該使用'new',但是你真的應該在現代C++的應用程序代碼中避免原始內存管理。 4.使用'QImage',您不必使用指針,因爲它是一個輕量級寫時複製類,因此您可以在可能的情況下使用值。 5.在現代C++中也應該避免使用C風格的數組,而在Qt中,如果您真的想要固定大小的數組,可以使用嵌套'QList',或'std :: vector'或'std:array'。 – hyde

+0

而且,它在Linux上工作可能是因爲您使用了一種編譯器,它使用C++支持C風格的可變長度數組(VLA)。它不是標準的C++,而是由特定編譯器提供的擴展。 – hyde

回答

0

我認爲Visual Studio編譯器仍然不能在堆棧上分配動態數量的內存(我認爲C++ 03不允許這樣做,而C99也是如此)。你可以使用_malloca作爲模擬。或者在Windows上切換到使用gcc

0

問題是您的動態數組並非真正的動態。

array_of_images是指針QImage的對象的靜態數組,和靜態數組的大小在編譯時間是已知的 - 這尺寸沒有你的情況已知的,因爲你的陣列的大小取決於輸入參數Arrange_Images()函數。

如果你想創建的QImage對象的動態分配的數組,你應該這樣做是這樣的:

QImage* array_of_images = new QImage[numOfCams*numOfBoards]; 

我也會考慮,如果你真的需要一個動態分配的數組,不能用類似的東西代替它的std ::向量。

如果Linux編譯器真的允許它在這種形式,我不知道爲什麼,因爲在我看來,它不應該編譯。

+0

好的,感謝您的幫助,經過幾次嘗試,它爲我工作的方式如下: 'QImage ** array_of_images; array_of_images = new QImage [numOfCams * numOfBoards];' array_of_images是一個指向QImage單元格的指針數組(每個QImage單元格是一種指針)。 –

+0

這就是我剛剛寫的更新 - 你可能想要一個指向QImage對象的指針數組,而不是QImage對象數組;) – KjMag

0

爲了得到它快速的工作,嘗試這條線的,而不是你現在擁有的一切:

std::vector<QImage*> array_of_images(numOfCams*numOfBoards); 

您需要#include <vector>過,當然。其餘的代碼應該保持一致,因爲std::vector在超出作用域時就會自行釋放自身(但不是指向它的指針的內容!),就像當前的C風格數組一樣。

+0

謝謝!我會在稍後嘗試。這是個好主意,我認爲你使用vector或qlist。 –

+0

@DmitryKezin嗯,使用'QList'或'std :: vector'確實是一個偏好和風格問題,在Qt C++代碼中都很好。 – hyde