对使用new动态分配内存感到困惑。
e.g。如果我需要为100个整数分配内存(假设int是4个字节),我应该说:
int *ptr = new int[100];
或
int *ptr = new int[100*4]; //assuming int is 4 bytes.
基本上新的运算符以字节为单位分配内存,或者在调用new运算符时使用T类型的多个字节?
如果我的班级没有定义分配器成员函数,&我需要分配该类类型的对象数组,新的oeprator是否会找到sizeof(类类型)并相应地分配或者它将如何工作?
编辑:
很抱歉有多个问题,但与之相关:
如果我想分配一个大小为[100] [4]的二维数组
,这段代码会正常工作吗?int *arr = new int [100][4];
谢谢。
-AD
答案 0 :(得分:4)
赋予new的大小是项目数,而不是内存大小。但是,请考虑使用std :: vector。
例如,new int[100]
至少分配100 * sizeof(int)
个字节(当sizeof(int)为4时为400);它分配的任何更多都将归因于实现和运行时细节,你(很少很除外)不能依赖它。
如果您的班级中没有运算符new或运算符new [](通常不应该这样),那么将使用全局版本,并且它们将正确使用sizeof(your_type)。
你有try the code in the update吗?
多维数组实际上是数组的数组;所以new返回一个指向第一个项的指针,就像它对单维数组一样,这是一个指向数组的指针:
typedef int int4[4]; // for clarity
int4 *arr = new int4[100];
// above two lines are identical to:
int (*arr)[4] = new int[100][4];
同样,使用容器几乎总是比自己管理更好。那是矢量等。 al。,还有像boost :: array这样的容器和“square”二维数组的专用“矩阵”类型。
答案 1 :(得分:1)
由于malloc
使用数据大小而不是项目数,可能会产生混淆。要分配100个整数的数组,您可以这样做:
int *ptr = (int *)malloc(100 * 4);
或(更好,适用于所有平台,因为int
并不总是4个字节长):
int *ptr = (int *)malloc(100 * sizeof(int));
而不是:
int *ptr = new int[100];
正如Fred所说,会自动使用数据大小来分配正确的区域。当然,malloc
只能用于内置类型,例如int
。