C++中new和delete的用法

4

我需要帮助理解何时应使用以下选项:

char *a = new char();

并且

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

以及如何进行相应的内存释放调用?


1
http://www.cplusplus.com/reference/std/new/ - Don Reba
在了解何时使用它们之前,您需要了解它们的作用。您了解吗? - Jon
1
你真正想做什么? - Martin York
5个回答

17
任何时候使用new T,都必须在返回的指针上调用delete
任何时候使用new T[n],都必须在返回的指针上调用delete[]
就是这样简单。
但请注意,通常你根本不应该使用它们。
如果你需要一个字符串,请不要分配一个字符数组。只需声明一个std::string(不使用new)。 如果您需要一个在运行时才确定大小的数组,请不要分配数组。声明一个std::vector(不使用new)。

5

你展示的所有表达都没有太多意义。

此外,作为一般规则,永远不要使用显式的delete(把这个交给智能指针和集合),并尽量避免使用任何显式的new

对于简单的带有char元素的字符串,只需使用

std::string a;

这是一个将new和delete操作交给库类处理的示例(这是最好的做法),在本例中使用的是std::string。
为了获取std::string类型的声明,请包含头文件。

5
第一个分配了一个单个字符。您可以使用以下方式删除它:
delete a;

第二个示例分配了一个字符数组。您选择的长度有点奇怪。您可以使用以下代码释放它:
delete[] a;

现在...我希望您不要认为您可以在第二个a中放入一个字符串化的数字,例如"123456",因为您需要更多的字节。假设int是32位,则至少需要12个字节。有一个有趣的公式可以计算所需的最小长度。它是对https://stackoverflow.com/a/2338397/613130的log10的近似值。
明确一下,在我的机器上,sizeof(int) == 4,但在一个int中,我可以放置-2147483648,这是10个数字加上-,所以是11(加上零终止符)。

3
char *a = new char();

这将创建一个指向单个已初始化的char的指针。

char *a = new char;

创建一个指向未初始化的char的指针。

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

创建一个动态分配的char数组,大小为sizeof(int)+1,即一个未初始化的大小为sizeof(int)+1的c字符串。可能是5或9,具体取决于sizeof(int)的大小。
char *a = new char[sizeof(int)+1]();

相同,但字符串已初始化。

对于单个char*,您需要使用delete显式释放内存,并使用delete[]释放char数组的内存。


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 指针后面的内存或随机内存。

c[1]根据定义是*(c+1),因此它不是“随机内存”。 它是一个明确定义的内存位置。问题在于它很可能被用于其他用途...所以,是的,以那种方式访问它是“非法”的(除非你知道自己在做什么,当然!) - Emilio Garavaglia
@EmilioGaravaglia 我只是用“随机”这个词来表示 c[1] 可以给你任何数据。但你是正确的,谢谢澄清。 - Peter Monks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接