使用 'new[]' 运算符分配内存

Allocating memory with the 'new[]' operator

我正在尝试在 Arduino Due 上制作简单的 3D 图形。其中,我创建了一个 PointContainer class 和一个 Vector3D class。我意识到我有内存问题,因为当我创建一个大约有 100 个点的对象时,Arduino 草图不起作用。

我使用 arduino.cc 论坛上推荐的代码来监控内存使用情况。

这是我的 Arduino sketch 的 setup() 函数中的一行代码:

PointContainer pcSphere(84);

在这一行之前,空闲内存是 55024 字节,在它之后,是 32480 字节。

PointContainerVector3D class 是这样定义的:

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 运算符的方式不对。但是动态创建简单数组的正确方法是什么?

new T[n]n 类型 T 对象分配内存(并构造它们),而不是 n 字节。因此,像这样的乘法:

new T[n*sizeof(T)]

错了。