【问题标题】:Use of new and delete in C++C++中new和delete的使用
【发布时间】:2023-03-22 23:41:01
【问题描述】:

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

char *a = new char();

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

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

【问题讨论】:

标签: c++


【解决方案1】:

任何时候使用new T,之后都必须在结果指针上调用delete

任何时候你使用new T[n],你必须在结果指针上调用delete[]

这就是它的全部内容。

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

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

【讨论】:

    【解决方案2】:

    第一个分配一个字符。你删除它:

    delete a;
    

    第二个分配一个字符数组。你选择的长度有点奇怪。您使用以下方式释放它:

    delete[] a;
    

    现在...我希望你不要认为你可以在第二个a 中放入一个字符串化的数字(类似于"123456",因为你需要更多的字节。假设至少有 12 个 @ 987654326@ 是 32 位。有一个有趣的公式可以计算所需的最小长度。它是 log10 https://stackoverflow.com/a/2338397/613130 的近似值

    需要明确的是,在我的机器上 sizeof(int) == 4,但在 int 中我可以输入 -2147483648,即 10 位数字加上 -,所以 11(加上零终止符)

    【讨论】:

      【解决方案3】:

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

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

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

      std::string a;
      

      这是一个将new-ing 和delete-ing 留给库类的示例(强烈推荐),在本例中为std::string

      包含<string> 标头以获得std::string 类型的声明。

      【讨论】:

        【解决方案4】:
        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 数组。

        【讨论】:

          【解决方案5】:

          与其他答案一样值得指出的另一件事是不要混淆这两个语句 - 您应该知道您是否将指针或数组分配给 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),所以它不是“随机内存”。这是一个定义明确的内存位置。问题是它很可能用于其他用途......所以是的,以这种方式访问​​它是“非法的”(当然,除非你知道自己在做什么!)
          • @EmilioGaravaglia 我只是用“随机”这个词来表示c[1] 会给你任何数据。但你是对的,谢谢你的澄清
          猜你喜欢
          • 1970-01-01
          • 2012-10-26
          • 2017-12-07
          • 1970-01-01
          • 2021-07-17
          • 2014-12-28
          • 1970-01-01
          • 1970-01-01
          • 2020-05-06
          相关资源
          最近更新 更多