C++ 如何正确删除std::string数组

C++ 如何正确删除std::string数组,c++,arrays,string,multidimensional-array,delete-operator,C++,Arrays,String,Multidimensional Array,Delete Operator,我可以创建一个3x2整数的动态2d数组,并且可以毫无问题地删除它。但当对二维字符串数组执行相同操作时,删除它会生成错误: munmap_chunk():指针无效 为什么?INT和字符串之间缺乏同质性,这使得我无法编写可以用字符串实例化的模板 我知道有自动指针。我知道有更好的方法来替代原始语言数组。但我是一名教师,我试图一个接一个地介绍课程,所以我仍然无法使用那些更高级的主题。我试图用模板解释抽象类型的数据 #include<string> #include<iostream&g

我可以创建一个3x2整数的动态2d数组,并且可以毫无问题地删除它。但当对二维字符串数组执行相同操作时,删除它会生成错误:

munmap_chunk():指针无效

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


我知道有自动指针。我知道有更好的方法来替代原始语言数组。但我是一名教师,我试图一个接一个地介绍课程,所以我仍然无法使用那些更高级的主题。我试图用模板解释抽象类型的数据

#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;
}
#包括
#包括
int main()
{
STD::CUT

而不是不安全(正如您的程序已经演示的)动态的“手动”分配的数组C++建议标准容器<代码> STD::vector < /C> > /< 然而,对于您的程序,您使用的是一个无效的运算符delete和动态分配的数组

而不是

delete a[i];

你必须使用

delete [] a[i];

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

#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数组和适当的手动内存管理是非常高级的。使用
std::vector
很容易。我怀疑在教标准容器之前教模板是一种逻辑顺序。你不需要理解模板就可以理解
vector
或如何使用它们。你只需要理解模板就可以实现标准容器应该是早期的教学内容之一。甚至可能在动态分配和C数组之前。你决定教“基本”但显然容易出错的内存管理,而不是“更高级的主题”,这是故意的讽刺吗?:)“看后”这就是问题所在。他们会看到吗?如果这个程序没有发生内存故障,他们会意识到吗?:(@LightnessRacesinOrbit例如异常和忘记释放内存或更改已分配内存的初始地址如何?:)@VladfromMoscow要了解复杂性,你需要做一些比较。否则,这看起来是正常的做法。这是另一个原因,从更简单的更高级别解决方案开始会更好。当他们开始手动内存管理时,这对他们来说很糟糕,他们欣赏自己执行内存管理的认知负担强加。@FrançoisAndrieux我看到了两种方法。甚至像std::cout这样的结构
delete [] s[i];