使用 '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 字节。
PointContainer
和 Vector3D
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)]
错了。
我正在尝试在 Arduino Due 上制作简单的 3D 图形。其中,我创建了一个 PointContainer
class 和一个 Vector3D
class。我意识到我有内存问题,因为当我创建一个大约有 100 个点的对象时,Arduino 草图不起作用。
我使用 arduino.cc 论坛上推荐的代码来监控内存使用情况。
这是我的 Arduino sketch 的 setup()
函数中的一行代码:
PointContainer pcSphere(84);
在这一行之前,空闲内存是 55024 字节,在它之后,是 32480 字节。
PointContainer
和 Vector3D
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)]
错了。