[英]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 。 有关这方面的更多信息,请参阅上面的new
和malloc()
链接。
除此之外,您正在分配 memory 因此您有责任在完成后释放它。 因此,理想情况下, new
和new[]
将分别跟随delete
和delete[]
。 而且, malloc()
之后将是free()
。
有关基于RAII的自动 memory 管理,请参阅智能指针,例如std::unique_pointer和std::shared_ptr以及std::make_unique
和std::make_shared
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.