在C ++中使用new和delete

时间:2012-03-14 09:14:16

标签: c++

我需要帮助才能理解何时使用以下选项

char *a = new char();

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

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

5 个答案:

答案 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]();

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

您需要使用deletechar*明确释放内存,为delete[]数组char明确释放内存。

答案 4 :(得分:0)

值得指出的另一件事以及其他答案是不要混淆两个语句 - 您应该知道是否为char* c分配了指针或数组,以便:

  1. 清理内存时调用正确的delete / delete[]运算符
  2. 您不会尝试访问指针范围之外的数据。
  3. 例如,如果您这样做:

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