2012-03-14 45 views
3

我需要理解帮助我什么时候使用下面的选项使用new和delete在C++

char *a = new char(); 

char *a = new char[sizeof(int)+1]; 

,以及如何在各自的内存释放呼叫应?

+1

http://www.cplusplus.com/reference/std/new/ – 2012-03-14 09:15:56

+0

在理解*何时*使用它们之前,您需要了解*他们做了什么。你做? – Jon 2012-03-14 09:16:56

+1

你真的想做什么? – 2012-03-14 10:04:13

回答

4

拳头一个分配一个单个字符。您将其删除:

delete a; 

第二个分配一个字符数组。你选择的长度有点奇怪。你释放它:

delete[] a; 

现在...我希望你不认为你可以把字符串化的数量在第二a(类似"123456",因为你需要更多的字节让我们在说。如果int是32位,则至少12个。有一个有趣的公式来计算所需的最小长度。它的日志10的近似https://stackoverflow.com/a/2338397/613130

需要明确的是,我的机器sizeof(int) == 4,但在int我可以把-2147483648是10位数字加上-,使11(加上0终结)

5

你表现出来的表达方式都没有多大意义。

另外,作为一般规则,切勿使用明确的delete(将其留给智能指针和集合),并尽量避免使用任何明确的new

对于char元件简单的字符串,只需使用

std::string a; 

这是离开new -ing和delete -ing到库类(这是强烈优选的),在这种情况下std::string的一个例子。

附上<string>头得到std::string类型的声明。

10

使用new T任何时候,你必须调用上所产生的指针delete之后。

如果您使用new T[n],则必须在随后生成的指针上调用delete[]

而且这真的就是这么简单。

但请注意,您通常不应使用它们。

如果你需要一个字符串,不分配一个字符数组。只需声明std::string(不使用new)。如果您需要一个大小在运行时确定的数组,请不要分配数组。声明一个std::vector(不使用new)。

3
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[]

0

另一件事值得指出的以及其他的答案是没有的两种说法了混合 - 你应该知道你是否分配的指针或数组char* c使:

  1. 你调用正确的delete/delete[]操作员清理内存时
  2. 您不会尝试访问超出指针范围的数据。

例如,如果你这样做:

// 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指针或随机存储器之后的内存。

+0

c [1]的定义是*(c + 1),所以它不是“随机存储器”。 这是一个明确的内存位置。问题在于它最有可能用于别的东西...所以是的,以这种方式访问​​它是“非法的”(除非你知道你在做什么,当然!) – 2012-03-14 10:09:06

+0

@EmilioGaravaglia我只是用“随机“来表示'c [1]'会给你任何可能的数据。但是你说得对,谢谢澄清 – 2012-03-14 10:20:26

相关问题