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

Posted

技术标签:

【中文标题】随机错误核心转储:`./a.out\' 中的错误:free():下一个大小无效(快速):0x00000000010e8d70 *** 中止(核心转储)【英文标题】:Random error core dump :Error in `./a.out': free(): invalid next size (fast): 0x00000000010e8d70 *** Aborted (core dumped)随机错误核心转储:`./a.out' 中的错误:free():下一个大小无效(快速):0x00000000010e8d70 *** 中止(核心转储) 【发布时间】:2020-06-21 05:28:04 【问题描述】:
#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(): invalid next size (fast): 0x00000000010e8d70 *** Aborted (core dumped)**” 随机随机输入。 很多时候它适用于相同的输入,有时它会失败并给出错误。

它在不引发错误的情况下给出正确的输出。

【问题讨论】:

【参考方案1】:

当你写入向量时会超出范围。

您不应该使用 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() 元素留出空间时,最后一个元素的索引将位于 str2.length() -1

您可以通过将向量的实例化更改为 str2.length()+1 而不是 str2.length() 来纠正这些问题:

  std::vector<std::vector<int>> strMat(str1.length()+1,std::vector<int>(str2.length()+1,0));

【讨论】:

确定我正在检查 @RajGM 我更新了我的答案以包括解决问题的可能方法。这是我帖子的最后一部分。 嗨@bhristov 如何使用 at() 函数访问二维向量? @RajGM strMat.at(index1).at(index2) 但您也可以将初始化向量的方式从 str2.length() 更改为 str2.length() + 1,这应该解决您的问题。使用 .at() 函数只是做索引检查,并不能解决问题。 让我们continue this discussion in chat。

以上是关于随机错误核心转储:`./a.out' 中的错误:free():下一个大小无效(快速):0x00000000010e8d70 *** 中止(核心转储)的主要内容,如果未能解决你的问题,请参考以下文章

什么原因导致C中出现分段错误(核心转储)?

C++ 代码的分段错误(核心转储)

C中的Minishell“分段错误,核心转储”错误

c中的分段错误(核心转储)

pyqt5 中的分段错误(核心转储)

C中的分段错误问题(核心转储)