如何正确删除 std::string 的数组
How to properly delete an array of std::string
我可以创建一个 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;
}
动态地 "manually" 分配数组而不是不安全的(如您的程序所演示的)C++ 建议使用标准容器 std::vector
。
尽管如此,对于您的程序,您正在对动态分配的数组使用无效的运算符删除。
而不是
delete a[i];
和
delete s[i];
你必须使用
delete [] a[i];
和
delete [] s[i];
But I am a teacher and I am trying to introduce the subjects one by
one, so I still cannot use those more advanced topics. I am trying to
explain abstract types of data with templates.
我认为这种教学方法没有什么不好。在看到使用动态分配数组会出现什么困难后,学生将更好地理解使用标准容器的优点。:)
我可以创建一个 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;
}
动态地 "manually" 分配数组而不是不安全的(如您的程序所演示的)C++ 建议使用标准容器 std::vector
。
尽管如此,对于您的程序,您正在对动态分配的数组使用无效的运算符删除。
而不是
delete a[i];
和
delete s[i];
你必须使用
delete [] a[i];
和
delete [] s[i];
But I am a teacher and I am trying to introduce the subjects one by one, so I still cannot use those more advanced topics. I am trying to explain abstract types of data with templates.
我认为这种教学方法没有什么不好。在看到使用动态分配数组会出现什么困难后,学生将更好地理解使用标准容器的优点。:)