我需要理解帮助我什么时候使用下面的选项使用new和delete在C++
char *a = new char();
和
char *a = new char[sizeof(int)+1];
,以及如何在各自的内存释放呼叫应?
我需要理解帮助我什么时候使用下面的选项使用new和delete在C++
char *a = new char();
和
char *a = new char[sizeof(int)+1];
,以及如何在各自的内存释放呼叫应?
拳头一个分配一个单个字符。您将其删除:
delete a;
第二个分配一个字符数组。你选择的长度有点奇怪。你释放它:
delete[] a;
现在...我希望你不认为你可以把字符串化的数量在第二a
(类似"123456"
,因为你需要更多的字节让我们在说。如果int
是32位,则至少12个。有一个有趣的公式来计算所需的最小长度。它的日志10的近似https://stackoverflow.com/a/2338397/613130
需要明确的是,我的机器sizeof(int)
== 4,但在int
我可以把-2147483648
是10位数字加上-
,使11(加上0终结)
你表现出来的表达方式都没有多大意义。
另外,作为一般规则,切勿使用明确的delete
(将其留给智能指针和集合),并尽量避免使用任何明确的new
。
对于char
元件简单的字符串,只需使用
std::string a;
这是离开new
-ing和delete
-ing到库类(这是强烈优选的),在这种情况下std::string
的一个例子。
附上<string>
头得到std::string
类型的声明。
使用new T
任何时候,你必须调用上所产生的指针delete
之后。
如果您使用new T[n]
,则必须在随后生成的指针上调用delete[]
。
而且这真的就是这么简单。
但请注意,您通常不应使用它们。
如果你需要一个字符串,不分配一个字符数组。只需声明std::string
(不使用new
)。如果您需要一个大小在运行时确定的数组,请不要分配数组。声明一个std::vector
(不使用new
)。
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
一个char*
和delete[]
。
另一件事值得指出的以及其他的答案是没有的两种说法了混合 - 你应该知道你是否分配的指针或数组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!
因为有上指针试图访问c[1]
会做一些没有安全的得分后卫,但是在这种情况下它会不回报,你期待什么,它很可能会返回存储在char* c
指针或随机存储器之后的内存。
c [1]的定义是*(c + 1),所以它不是“随机存储器”。 这是一个明确的内存位置。问题在于它最有可能用于别的东西...所以是的,以这种方式访问它是“非法的”(除非你知道你在做什么,当然!) – 2012-03-14 10:09:06
@EmilioGaravaglia我只是用“随机“来表示'c [1]'会给你任何可能的数据。但是你说得对,谢谢澄清 – 2012-03-14 10:20:26
http://www.cplusplus.com/reference/std/new/ – 2012-03-14 09:15:56
在理解*何时*使用它们之前,您需要了解*他们做了什么。你做? – Jon 2012-03-14 09:16:56
你真的想做什么? – 2012-03-14 10:04:13