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

时间:2017-08-25 22:05:24

标签: c++ arrays memory-leaks new-operator

我正在尝试在Arduino Due上做简单的3D图形。除此之外,我创建了一个PointContainer类和一个Vector3D类。我意识到我有一个记忆问题,因为当我创建一个大约100个点的对象时,Arduino草图不​​起作用。

我使用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)];
}

我知道在使用delete后我必须使用new释放内存。但我使用矢量数据直到程序结束,所以这不是问题。

sizeof(Vector3D)是16,我查了一下。 PointContainer pcSphere(84)应该只分配约。 1344字节的内存,但现在,它分配22544字节。当我直接创建数组时,如Vector3D points[84] = {Vector3D(1,1,1,1),...},它会分配正确数量的1344字节内存。

我认为我以错误的方式使用new运算符。但是动态创建简单数组的正确方法是什么?

1 个答案:

答案 0 :(得分:4)

imread为类型为new T[n]的{​​{1}}个对象分配内存(并构造它们),而不是n个字节。因此,乘法如下:

T

错了。