我需要帮助才能理解何时使用以下选项
char *a = new char();
和
char *a = new char[sizeof(int)+1];
以及如何进行相应的内存释放调用?
答案 0 :(得分:12)
只要您使用new T
,就必须在之后的结果指针上调用delete
。
只要您使用new T[n]
,就必须在之后的结果指针上调用delete[]
。
这就是它的全部内容。
但请注意,您通常不应该使用它们。
如果需要字符串,请不要分配char数组。只需声明std::string
(不使用new
)。如果需要一个在运行时确定其大小的数组,请不要分配数组。声明std::vector
(不使用new
)。
答案 1 :(得分:5)
您展示的所有表达都没有多大意义。
此外,作为一般规则,永远不要使用明确的delete
(将其留给智能指针和集合),并尽量避免使用任何明确的new
。
对于包含char
元素的简单字符串,只需使用
std::string a;
这是一个将new
- 和delete
- 保留给库类(这是非常可取的)的示例,在本例中为std::string
。
包含<string>
标头以获取std::string
类型的声明。
答案 2 :(得分:5)
第一个分配一个char。您可以使用以下命令删除它:
delete a;
第二个分配一个字符数组。你选择的长度有点奇怪。您将其解除分配:
delete[] a;
现在......我希望你不要认为你可以在第二个a
(类似"123456"
之类的字符串中放置一个字符串化的数字,因为你需要更多的字节。至少可以说12如果int
是32位。有一个有趣的公式来计算所需的最小长度。它是log10 https://stackoverflow.com/a/2338397/613130
要清楚,在我的机器上sizeof(int)
== 4,但在int
我可以将-2147483648
加上10位数加-
,所以11(再加零终结者)
答案 3 :(得分:3)
char *a = new char();
这会创建一个指向单个初始化char
的指针。
char *a = new char;
创建指向单个未初始化char
的指针。
char *a = new char[sizeof(int)+1];
创建一个动态分配的大小为sizeof(int)+1
的char数组,即一个大小为sizeof(int)+1
的未初始化的c-string。可能是5或9,取决于sizeof(int)
。
char *a = new char[sizeof(int)+1]();
相同,但字符串已初始化。
您需要使用delete
为char*
明确释放内存,为delete[]
数组char
明确释放内存。
答案 4 :(得分:0)
值得指出的另一件事以及其他答案是不要混淆两个语句 - 您应该知道是否为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
指针或随机存储器之后。