【问题标题】:delete memory automatically allocated by assignment of a literal [closed]删除通过分配文字自动分配的内存[关闭]
【发布时间】:2014-06-28 09:26:11
【问题描述】:
char *str = "hi";

delete [] str;

我想知道为什么我们不能通过 delete 操作符来释放内存?执行此操作时,我收到exception“运行时错误”。

char *str = "hi"; 自动分配内存并在其中写入字符串。
所以删除运算符应该可以工作,还是我对这个假设有误?

【问题讨论】:

  • 没有(动态)内存分配 - str 只是一个指向字符串文字的指针。
  • 你的标题建议你想问一下删除新操作符分配的内存。您的问题不涉及 new 运算符。那你在问什么?
  • @PaulR 在最一般的意义上,有(特别是静态和自动分配),只是没有动态内存分配。
  • @PaulR 我已投票决定重新提出这个问题,因为它表达了一个非常普遍的误解,即 c++ 如何处理这些事情。答案也可能非常适合帮助其他人进行研究。请在关闭此之前提供适当的副本!
  • 可能 - 查找重复项可能是一项艰巨的工作,即使您知道有很多重复项。

标签: c++


【解决方案1】:

我想知道为什么我们不能通过删除操作符释放内存?

在这种情况下你不需要!

char *str = "hi"; 自动分配内存并在其中写入字符串。

不,它没有!这一切都发生在编译时(甚至应该给你一个警告)。
您没有分配str,而是分配了一个指向const char* 文字的指针(允许编译器放置在实现想要的任何位置),因此您不能删除它。

使用new()delete 管理的动态分配意味着类似

char* str = new char[3];
strncpy(str,"hi",3);

// ...
delete [] str;

【讨论】:

    【解决方案2】:

    delete 用于取消分配最初使用new 分配的对象。 delete[] 用于取消分配最初使用new[] 分配的数组。

    您没有在第一行使用new,因此不应在第二行使用delete

    具体来说,

    char *str = "hi";
    

    为名为@9​​87654328@ 的指针 分配内存,该指针具有自动生命周期。这里的自动意味着编译器会为你处理它。

    指针指向一个字符串字面量"hi",它在编译时被静态分配一次,并且永远无法更改。事实上,你的指针应该是 const。

    现在,如果我们将您的代码更改为

    std::string str = "hi";
    

    动态分配确实发生在 std::string 复制您的字符串文字后,但它也负责为您释放该副本。它很可能在内部使用new[]delete[]

    【讨论】:

      【解决方案3】:

      你的问题要注意的关键是

      char *str = "hi"; 自动分配内存并写入字符串

      字符串文字被自动分配自动解除分配。你不能自己释放内存。

      请注意,它们将持续到程序的整个生命周期,而不仅仅是变量的范围。见this SO answer

      【讨论】:

        【解决方案4】:

        这是一个公平的问题。但是,常量字符串的业务远不止眼前所见:编译器和链接器可以随意维护只读文字池。

        事实上,如果您示例中的str 是在自动(函数本地,堆栈)存储中并且您有一个高速内存池处理程序,您可能会通过尝试释放它来制造灾难性的混乱然后重复使用它。 (不要在家里尝试这个:-)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-17
          • 2013-12-27
          • 2017-07-06
          • 1970-01-01
          • 2014-01-19
          • 2020-06-23
          • 2014-03-18
          • 1970-01-01
          相关资源
          最近更新 更多