2017-08-25 86 views
-1

我正試圖在Arduino Due上做簡單的3D圖形。其中,我創建了一個PointContainer類和一個Vector3D類。我意識到我有一個內存問題,因爲當我創建了一個約100分的對象時,Arduino草圖將不起作用。用'new []'運算符分配內存

我在arduino.cc論壇上使用了建議的代碼來監視內存使用情況。

這是代碼在我的Arduino草圖的setup()功能的線路:

PointContainer pcSphere(84); 

這條線之前,可用內存爲55024個字節後,它是32480個字節。

這是怎麼PointContainerVector3D類定義:

class Vector3D { 
    public: 
     Vector3D(int16_t x, int16_t y, int16_t z, int16_t w); 

     int32_t data[4] = {0, 0, 0, 128}; 
}; 

Vector3D::Vector3D(int16_t x, int16_t y, int16_t z, int16_t w){ 
    data[0] = x<<7; 
    data[1] = y<<7; 
    data[2] = z<<7; 
    data[3] = w<<7; 
} 

class PointContainer { 
    public: 
     PointContainer(uint8_t pointCount); 

     Vector3D *points; 

    private: 
     uint8_t pointCount; 
}; 

PointContainer::PointContainer(uint8_t pointCount) { 
    this->pointCount = pointCount; 
    points = new Vector3D [pointCount * sizeof(Vector3D)]; 
} 

我知道我有使用new後使用delete來釋放內存。但是我使用矢量數據直到程序結束,所以這不是問題。

sizeof(Vector3D)是16,我檢查了。 PointContainer pcSphere(84)應該只分配約。內存1344字節,但現在,它分配22544字節。當我直接創建陣列時,如Vector3D points[84] = {Vector3D(1,1,1,1),...},它分配正確數量的1344字節的內存。

我想我以錯誤的方式使用new操作符。但是動態創建一個簡單數組的正確方法是什麼?

+0

'T * p = new T [123];''''''''''''''''' 'T'是你的類型。 – Ron

+0

@Ron請在你寫之前閱讀。 – uzumaki

+2

我做到了。是不是你的問題:_但是什麼是動態創建一個簡單數組的正確方法?_ – Ron

回答

4

new T[n]n分配內存T(並構造它們)的對象,而不是n字節。因此,乘這樣的:

new T[n*sizeof(T)]

是錯誤的。

+0

不會多餘意味着它沒有壞處?這完全錯了。 – 2017-08-25 23:06:34

+0

@ manni66我不明白這個詞是怎麼意思的,但爲了清晰起見,我會編輯答案。 – milleniumbug

相關問題