2017-08-25 87 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