如何正确删除 std::string 数组 [重复]

Posted

技术标签:

【中文标题】如何正确删除 std::string 数组 [重复]【英文标题】:How to properly delete an array of std::string [duplicate] 【发布时间】:2019-12-27 18:24:38 【问题描述】:

我可以创建一个 3x2 整数的动态二维数组,并且可以毫无问题地删除它。但是当对一个二维字符串数组做同样的事情时,删除它会产生错误:

munmap_chunk(): 无效指针

为什么? 整数和字符串之间缺乏同质性使我无法编写可以用字符串实例化的模板

我知道有自动指针。我知道原始语言数组有更好的选择。但我是一名教师,我正在尝试逐一介绍这些科目,所以我仍然无法使用那些更高级的主题。我试图用模板解释抽象类型的数据。

#include<string>
#include<iostream>

int main()

  std::cout << "2d-ARRAY of ints" << std::endl;
  int **a = new int*[3];
  for(int i=0; i<3; i++)
    a[i] = new int[2];
  for(int i=0; i<3; i++)
    delete a[i];
  delete [] a;

  std::cout << "2d-ARRAY of strings" << std::endl;
  std::string **s = new std::string*[3];
  for(int i=0; i<3; i++)
    s[i] = new std::string[2];
  for(int i=0; i<3; i++)
    delete s[i];
  delete [] s;
  return 0;

【问题讨论】:

你是一名老师......你为什么要教创建这样的二维数组?使用 std::vectors。 固定大小使用std::array,否则使用std::vector,我看不出有什么理由在这里输入这些困难 "所以我仍然不能使用那些更高级的主题" ...使用 c-arrays 和适当的手动内存管理是超级先进的。使用std::vector 很容易。 我怀疑在教授标准容器之前教授模板是否符合逻辑顺序。您无需了解模板即可了解vectors 或如何使用它们。您只需要了解模板即可实现它们。标准容器应该是早期教授的内容之一。甚至可能在动态分配和 C 数组之前。 你决定教授“基本”但明显容易出错的内存管理,而不是“更高级的主题”,这是否是故意讽刺的,即使你也无法正确? :) 【参考方案1】:

C++ 建议使用标准容器 std::vector,而不是不安全(如您的程序所展示的)动态“手动”分配的数组。

尽管如此,对于您的程序,您正在使用无效的运算符 delete 和动态分配的数组。

代替

delete a[i];

delete s[i];

你必须使用

delete [] a[i];

delete [] s[i];

但我是一名教师,我正在尝试逐一介绍这些科目 一,所以我仍然不能使用那些更高级的主题。我在尝试着 用模板解释数据的抽象类型。

我认为这种教学方法没有什么不好。在看到使用动态分配的数组会出现什么困难之后,学生将更好地理解使用标准容器的优势。:)

【讨论】:

“看到之后” 问题就在这里。他们会看到吗?如果这个程序没有碰巧导致内存故障,他们甚至会意识到这一点吗? :( @LightnessRacesinOrbit 例如异常和忘记释放内存或更改分配内存的初始地址怎么样?:) @VladfromMoscow 要查看复杂性,您需要进行比较。否则,这看起来像是正常的事情。这是从更简单的高级解决方案开始更好的另一个原因。当他们进行手动内存管理时,这对他们来说很糟糕,他们很欣赏自己执行内存管理所带来的认知负担。 @FrançoisAndrieux 我看到了两种方法。甚至像 std::cout

以上是关于如何正确删除 std::string 数组 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

从 std::string 中删除特定的连续字符重复

深拷贝 std::string::c_str() 到 char * [重复]

从 int8_t 数组创建 std::string

我可以在 IOCP WSARecv 函数中使用 std::string 吗?

用空格替换 std::string 中的特定字符

在 C# 中替代 std::string [重复]