【发布时间】:2023-03-22 23:41:01
【问题描述】:
我需要帮助以了解何时应使用以下选项
char *a = new char();
和
char *a = new char[sizeof(int)+1];
以及应该如何进行相应的内存释放调用?
【问题讨论】:
-
在了解何时使用它们之前,您需要了解它们做什么。你呢?
-
你真正想做什么?
标签: c++
我需要帮助以了解何时应使用以下选项
char *a = new char();
和
char *a = new char[sizeof(int)+1];
以及应该如何进行相应的内存释放调用?
【问题讨论】:
标签: c++
任何时候使用new T,之后都必须在结果指针上调用delete。
任何时候你使用new T[n],你必须在结果指针上调用delete[]。
这就是它的全部内容。
但请注意,您通常根本不应该使用它们。
如果你需要一个字符串,不要分配一个字符数组。只需声明一个std::string(不使用new)。如果您需要一个大小在运行时确定的数组,请不要分配数组。声明一个std::vector(不使用new)。
【讨论】:
第一个分配一个字符。你删除它:
delete a;
第二个分配一个字符数组。你选择的长度有点奇怪。您使用以下方式释放它:
delete[] a;
现在...我希望你不要认为你可以在第二个a 中放入一个字符串化的数字(类似于"123456",因为你需要更多的字节。假设至少有 12 个 @ 987654326@ 是 32 位。有一个有趣的公式可以计算所需的最小长度。它是 log10 https://stackoverflow.com/a/2338397/613130 的近似值
需要明确的是,在我的机器上 sizeof(int) == 4,但在 int 中我可以输入 -2147483648,即 10 位数字加上 -,所以 11(加上零终止符)
【讨论】:
你展示的所有表达都没有多大意义。
此外,作为一般规则,永远不要使用显式 delete(将其留给智能指针和集合),并尽量避免使用任何显式 new。
对于带有char 元素的简单字符串,只需使用
std::string a;
这是一个将new-ing 和delete-ing 留给库类的示例(强烈推荐),在本例中为std::string。
包含<string> 标头以获得std::string 类型的声明。
【讨论】:
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]();
同理,只是字符串被初始化了。
您需要使用 delete 显式释放内存以用于单个 char* 和 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!
因为对于试图访问 c[1] 的指针没有安全防护措施会做某事,但在这种情况下,它不会返回你所期望的,它很可能会返回存储在char* c 指针或随机内存。
【讨论】:
c[1] 会给你任何数据。但你是对的,谢谢你的澄清