随机错误核心转储:`./a.out' 中的错误:free():下一个大小无效(快速):0x00000000010e8d70 *** 中止(核心转储)
Random error core dump :Error in `./a.out': free(): invalid next size (fast): 0x00000000010e8d70 *** Aborted (core dumped)
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using std::string;
int edit_distance(const string &str1, const string &str2) {
std::vector<std::vector<int>> strMat(str1.length()+1,std::vector<int>(str2.length(),0));
for(int i=0;i<=str1.length();i++){
strMat[i][0] = i;
}
for(int j=0;j<=str2.length();j++){
strMat[0][j] = j;
}
for(int i=1;i<=str1.length();i++){
for(int j=1;j<=str2.length();j++){
int min1 = std::min(strMat[i][j-1]+1,strMat[i-1][j]+1);
int min2;
if(str1[i-1]==str2[j-1]){
min2 = std::min(min1,strMat[i-1][j-1]);
}
else if(str1[i-1]!=str2[j-1]){
min2 = std::min(min1,strMat[i-1][j-1]+1);
}
strMat[i][j] = min2;
}
}
int ans = strMat[str1.length()][str2.length()];
return ans;
}
int main() {
string str1;
string str2;
std::cin >> str1 >> str2;
std::cout << edit_distance(str1, str2) << std::endl;
return 0;
}
我收到错误消息:“***** `./a.out' 中的错误:free():无效的下一个大小(快速):0x00000000010e8d70 *** 中止(核心转储)** " 随机输入。
很多时候它在相同的输入上工作,有时它会失败并给出该错误。
它在不抛出错误的情况下给出正确的输出。
发生的情况是您在写入向量时越界。
您不应使用 C 风格 [] 访问数组,而应使用 .at(index),因为它会进行边界检查。
std::vector<std::vector<int>> strMat(str1.length()+1,std::vector<int>(str2.length(),0));
内部向量的大小为str2.length()
此处您正在写入超出其大小的 1 个元素。
for(int j=0;j<=str2.length();j++){
strMat[0][j] = j;
您在这里遇到了同样的问题:
for(int i=1;i<=str1.length();i++){
for(int j=1;j<=str2.length();j++){ // j <= str2.length() will cause you to access elements in the vector that are outside of its bounds
也在这里:
int ans = strMat[str1.length()][str2.length()];
由于 c++ 中的索引是基于 0 的,因此当您实例化向量以对 str2.length() 元素具有 space 时,最后一个元素的索引将位于 str2.length( ) -1
您可以通过将向量的实例化更改为 str2.length()+1 而不是 str2.length():
来更正这些问题
std::vector<std::vector<int>> strMat(str1.length()+1,std::vector<int>(str2.length()+1,0));
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using std::string;
int edit_distance(const string &str1, const string &str2) {
std::vector<std::vector<int>> strMat(str1.length()+1,std::vector<int>(str2.length(),0));
for(int i=0;i<=str1.length();i++){
strMat[i][0] = i;
}
for(int j=0;j<=str2.length();j++){
strMat[0][j] = j;
}
for(int i=1;i<=str1.length();i++){
for(int j=1;j<=str2.length();j++){
int min1 = std::min(strMat[i][j-1]+1,strMat[i-1][j]+1);
int min2;
if(str1[i-1]==str2[j-1]){
min2 = std::min(min1,strMat[i-1][j-1]);
}
else if(str1[i-1]!=str2[j-1]){
min2 = std::min(min1,strMat[i-1][j-1]+1);
}
strMat[i][j] = min2;
}
}
int ans = strMat[str1.length()][str2.length()];
return ans;
}
int main() {
string str1;
string str2;
std::cin >> str1 >> str2;
std::cout << edit_distance(str1, str2) << std::endl;
return 0;
}
我收到错误消息:“***** `./a.out' 中的错误:free():无效的下一个大小(快速):0x00000000010e8d70 *** 中止(核心转储)** " 随机输入。 很多时候它在相同的输入上工作,有时它会失败并给出该错误。
它在不抛出错误的情况下给出正确的输出。
发生的情况是您在写入向量时越界。
您不应使用 C 风格 [] 访问数组,而应使用 .at(index),因为它会进行边界检查。
std::vector<std::vector<int>> strMat(str1.length()+1,std::vector<int>(str2.length(),0));
内部向量的大小为str2.length()
此处您正在写入超出其大小的 1 个元素。
for(int j=0;j<=str2.length();j++){
strMat[0][j] = j;
您在这里遇到了同样的问题:
for(int i=1;i<=str1.length();i++){
for(int j=1;j<=str2.length();j++){ // j <= str2.length() will cause you to access elements in the vector that are outside of its bounds
也在这里:
int ans = strMat[str1.length()][str2.length()];
由于 c++ 中的索引是基于 0 的,因此当您实例化向量以对 str2.length() 元素具有 space 时,最后一个元素的索引将位于 str2.length( ) -1
您可以通过将向量的实例化更改为 str2.length()+1 而不是 str2.length():
来更正这些问题 std::vector<std::vector<int>> strMat(str1.length()+1,std::vector<int>(str2.length()+1,0));