使用'new'在C ++中进行动态分配

时间:2011-01-31 11:52:20

标签: c++ operators new-operator

对使用new动态分配内存感到困惑。

e.g。如果我需要为100个整数分配内存(假设int是4个字节),我应该说:

int *ptr = new int[100];

int *ptr = new int[100*4]; //assuming int is 4 bytes.
  1. 基本上新的运算符以字节为单位分配内存,或者在调用new运算符时使用T类型的多个字节?

  2. 如果我的班级没有定义分配器成员函数,&我需要分配该类类型的对象数组,新的oeprator是否会找到sizeof(类类型)并相应地分配或者它将如何工作?

  3. 编辑:

    很抱歉有多个问题,但与之相关:

    如果我想分配一个大小为[100] [4]的二维数组

    ,这段代码会正常工作吗?
    int *arr = new int [100][4];
    
    谢谢。

    -AD

2 个答案:

答案 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