我需要帮助理解何时应使用以下选项:
char *a = new char();
并且
char *a = new char[sizeof(int)+1];
以及如何进行相应的内存释放调用?
我需要帮助理解何时应使用以下选项:
char *a = new char();
并且
char *a = new char[sizeof(int)+1];
以及如何进行相应的内存释放调用?
new T
,都必须在返回的指针上调用delete
。new T[n]
,都必须在返回的指针上调用delete[]
。std::string
(不使用new
)。 如果您需要一个在运行时才确定大小的数组,请不要分配数组。声明一个std::vector
(不使用new
)。你展示的所有表达都没有太多意义。
此外,作为一般规则,永远不要使用显式的delete
(把这个交给智能指针和集合),并尽量避免使用任何显式的new
。
对于简单的带有char
元素的字符串,只需使用
std::string a;
delete a;
delete[] a;
a
中放入一个字符串化的数字,例如"123456"
,因为您需要更多的字节。假设int
是32位,则至少需要12个字节。有一个有趣的公式可以计算所需的最小长度。它是对https://stackoverflow.com/a/2338397/613130的log10的近似值。sizeof(int)
== 4,但在一个int
中,我可以放置-2147483648
,这是10个数字加上-
,所以是11(加上零终止符)。char *a = new char();
这将创建一个指向单个已初始化的char
的指针。
char *a = new char;
创建一个指向未初始化的char
的指针。
char *a = new char[sizeof(int)+1];
sizeof(int)+1
,即一个未初始化的大小为sizeof(int)+1
的c字符串。可能是5或9,具体取决于sizeof(int)
的大小。char *a = new char[sizeof(int)+1]();
相同,但字符串已初始化。
对于单个char*
,您需要使用delete
显式释放内存,并使用delete[]
释放char
数组的内存。
除了其他答案之外,还有一件值得指出的事情是不要混淆这两个语句——你应该知道你是将指针还是数组分配给了char* c
,以便:
delete
/delete[]
运算符例如,如果你这样做:
// Create a pointer to a single char and set the value
char* c = new char();
*c = 'a';
// Access the pointer using array syntax
char tmp1 = c[0]; // Works, returns 'a'
char tmp2 = c[1]; // Illegal!
char * c 指针后面的内存或随机内存。
c[1]
可以给你任何数据。但你是正确的,谢谢澄清。 - Peter Monks