c++ - 随机错误核心转储: `./a.out'中的错误:free():下一个大小无效(快速):0x00000000010e8d70 ***已中止(核心转储)

标签 c++ dynamic-programming coredump edit-distance

#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 ***异常中止(核心已转储**)”,随机输入。
它多次在相同的输入上工作,有时失败并给出该错误。
在不引发错误的情况下,它将给出正确的输出。

最佳答案

发生的情况是,写入 vector 时您超出了范围。
您不应使用C样式[]来访问数组,而应使用.at(index),因为它会进行边界检查。

  std::vector<std::vector<int>> strMat(str1.length()+1,std::vector<int>(str2.length(),0));
内部 vector 的大小为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的,因此当您实例化 vector 以为str2.length()元素留出空间时,最后一个元素的索引将位于str2.length()-1
您可以通过将 vector 的实例更改为具有str2.length()+ 1而不是str2.length()来纠正这些问题:
  std::vector<std::vector<int>> strMat(str1.length()+1,std::vector<int>(str2.length()+1,0));

关于c++ - 随机错误核心转储: `./a.out'中的错误:free():下一个大小无效(快速):0x00000000010e8d70 ***已中止(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62494740/

相关文章:

linux - 修改每个节点的核心转储磁盘空间利用率

c++ - 如何在 C++ 中使用 OLEDB 附加到 MDF 数据库文件?

c++ - 为什么 NDK 编译器无法识别 LOCAL_CFLAGS 定义?

algorithm - 2011年Informatica地方奥赛题1题

algorithm - 最优选择算法

algorithm - 给定右臂拉伸(stretch)的二叉搜索树的数量

c++ - 通过 C a #define(或其他代码/编译时解决方案)省略核心转储?

c++ - 返回指向 const 对象的 const 共享指针的 const vector

c++ - 如何使用 <array> header 声明二维数组?

C++ 程序在进行库调用时死掉