【问题标题】:How to delete/free a string literal?如何删除/释放字符串文字?
【发布时间】:2022-01-26 20:26:47
【问题描述】:

我有一个std::vector<const char*>,由.push_back("something") 填充。如何删除不包括std::string标题的内容? delete segfaults 和 std::free 需要 void* 并且它“无法使用 'const char *' 类型的左值初始化 [..]”。

【问题讨论】:

  • 您不会删除字符串文字。如果您只推送文字,则无法删除它们。
  • 如果你在推入字符串文字和动态分配的char 数组,你确实需要delete,你会发现几乎不可能将它们区分开来.在这种情况下,我可以推荐使用 std::string 端到端吗?

标签: c++ memory c++17 string-literals


【解决方案1】:

您可以delete 只使用您new 的内容。您没有使用 new 创建字符串文字,因此在它们上使用 delete 将导致未定义的行为。不要那样做。同样,您可以free 只使用您malloc 的内容(加上malloc 内部的一些相关功能)。

字符串字面量具有静态存储持续时间。这意味着它们的存储空间会在程序结束时自动释放,无需您干预。

您可以使用erase 成员函数从向量中擦除指针。

【讨论】:

    【解决方案2】:

    字符串字面量具有静态存储持续时间。您不能使用操作符 delete 删除它们。字符串字面量在程序结束之前一直有效,

    您可以删除使用运算符 new 创建的内容。

    您可以擦除矢量的所有或选定元素或完全清除它。

    【讨论】:

      【解决方案3】:

      "something" 这样的字符串文字存储在可执行文件的只读段中。你不能delete他们。而且,修改它们是未定义的行为。

      【讨论】:

      • 可执行文件中的位置(C++ 未定义的东西)在这里并不重要。这纯粹只是deletenew 的问题。
      • @user4581301 对。但是,有时也可以谈谈实现细节。
      猜你喜欢
      • 1970-01-01
      • 2015-12-16
      • 2013-08-05
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 2017-01-19
      • 2012-01-27
      • 2014-04-22
      相关资源
      最近更新 更多