繁体   English   中英

数组创建 int *array = new int[sizeof(int)*n]

[英]Array creation int *array = new int[sizeof(int)*n]

你能解释一下这个语句发生了什么,特别是在括号内吗?

int *array = new int[sizeof(int) * n];

这是一个完整的 C++ 语句, sizeof运算符的括号()包含int类型,而sizeof(type)以字节为单位给出封闭类型的大小:

int *array = new int[ sizeof(int) * n ];
                            ^^^^^

我相信您的意思是new表达式的方括号[]内的表达式,即sizeof(int) * n

从语义上讲,表达式可能是错误的。

如果您使用new运算符分配 10 个整数,则sizeof(int)会自动处理。 您只需提供要分配的类型的元素数量。

例如:

int  n = 10;                // n can be an integer entered by the user
int* a = new int[n];        // allocate an array of 10 integers

在这种情况下,数组元素将被默认初始化,并返回指向数组第一个元素的指针。

而且,当您这样做时(假设您在 64 位机器上,即sizeof(int)为 8):

int  n = 10;
int  s = sizeof(int) * n;   // 8 x 10 = 80
int* a = new int[ s ];      // allocate an array of 80 integers

这就是我之前所说的语义错误,因为意图可能是分配 10 个整数,而不是 80 个。

malloc()需要表达式sizeof(int) * n ,您必须提供要分配的确切字节数,因此您需要提供该类型元素的确切数量。 malloc() function 不会初始化分配的字节,它也会返回指向第一个元素的指针。

例如:

int  n = 10;
int  s = sizeof(int) * n;
int* a = (int*) malloc( s );

您必须初始化malloc()分配的 memory 。 有关这方面的更多信息,请参阅上面的newmalloc()链接。


除此之外,您正在分配 memory 因此您有责任在完成后释放它。 因此,理想情况下, newnew[]将分别跟随deletedelete[] 而且, malloc()之后将是free()

有关基于RAII的自动 memory 管理,请参阅智能指针,例如std::unique_pointerstd::shared_ptr以及std::make_uniquestd::make_shared

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM