C++ 段错误 - 核心已转储

标签 c++ pointers memory segmentation-fault coredump

<分区>

我遇到这个问题已经有一段时间了,我搜索过这种类型的错误,我相信它与内存泄漏或指向空指针的指针有关。

我一遍又一遍地检查了我的代码,但我无法准确找到此问题发生的位置,因为我不知道如何调试它。即使我尝试在代码的第一行断点,它也会崩溃。

它从文件中读取一堆 ISBN 并检查它们是否有效。

虽然看起来很多,其实道理很简单。

这是我的代码:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <list>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <vector>

using namespace std;

class Isbn
{
   private:
   string isbnCode;

   public:

   Isbn()
   {            
   }

   Isbn(string isbn): isbnCode(isbn)
   {               
   }

   ~Isbn()
   {              
   }

   string getIsbn()
   {
      return isbnCode;
   }

   void setIsbn(string input)
   {
      isbnCode = input;
   }
};

void setListOfIsbn(const string filename, list<Isbn> &listOfIsbn);
void validateIsbns(const list<Isbn> listOfIsbn, list<bool> &validations);
void printValidations(const list<Isbn> listOfIsbn, 
     const list<bool> validations);
string bToS(const bool bValue);

int main(int argc, char *argv[])
{
   list<Isbn> listOfIsbn;
   list<bool> validations;

   string inputFile = argv[1];

   setListOfIsbn(inputFile, listOfIsbn);
   validateIsbns(listOfIsbn, validations);
   printValidations(listOfIsbn, validations);

   return 0;
}

void setListOfIsbn(const string filename, list<Isbn> &listOfIsbn)
{
   list<Isbn>::const_iterator iterator;

   ifstream fin; 

   fin.open(filename.c_str()); 
   char ch;
   string isbnCode;

   while (!fin.eof()) 
   { 
      fin.get(ch);

      if (ch == '\n')
      {
         Isbn isbn;

         (isbn).setIsbn(isbnCode);
         listOfIsbn.push_back(isbn);
         isbnCode = "";         
      }
      else
      {
         isbnCode.append(reinterpret_cast<const char*>(ch));
      }
   } 
}

void validateIsbns(const list<Isbn> listOfIsbn, list<bool> &validations)
{
   list<Isbn>::const_iterator itr;

   for (itr = listOfIsbn.begin(); itr != listOfIsbn.end(); itr++)
   {
      Isbn isbn = *itr;
      string isbnCode = isbn.getIsbn();
      string isbnCodeReform = "";
      vector<int> products;
      int sumOfProducts = 0;
      unsigned int i;

      for (i = 0; i < isbnCode.length(); itr++)
      {
         if(isalnum(isbnCode[i]))
         {
            isbnCodeReform[i] = isbnCode[i];
         }
      }

      for (i = 0; i < (isbnCodeReform.length() - 1); itr++)
      {
         if(isbnCodeReform[i] == 'X')
         {
            isbnCodeReform[i] = 10;
         }         

         products[i] = isbnCodeReform[i] * (10 - i);      
      }

      vector<int>::const_iterator itr;

      for (itr = products.begin(); itr != products.end(); itr++)
      {
         sumOfProducts += products[*itr];
      }

      if ((sumOfProducts % 11) == 0)
      {
         validations.push_back(true);
      }
      else
      {
         validations.push_back(false);
      }
   }
}

void printValidations(const list<Isbn> listOfIsbn, 
     const list<bool> validations)
{
   list<Isbn>::const_iterator itr;
   list<bool>::const_iterator itr2 = validations.begin(); 

   for(itr = listOfIsbn.begin(); itr != listOfIsbn.end(); itr++)
   {
      string validate = bToS(*itr2);
      Isbn isbn = *itr;
      cout << isbn.getIsbn() + ": " + validate + "\n";
      itr2++;
   }
}

string bToS(const bool bValue)
{
   if(bValue == 0)
   {
      return "False";
   }
   else
   {
      return "True";
   }
}

如有任何帮助,我们将不胜感激!

最佳答案

我已尝试在下面详细说明尽可能多的明显错误。可能还有更多。有这么多错误,很明显您采用了错误的编程方法。首先,您应该清楚地考虑您正在编写的代码,仅仅编写看起来大致正确的代码是不够的,通过编程您必须完全正确地编写代码。其次,你写了太多低质量的代码。你应该写几行代码,在你写更多之前让它们工作。您在这里错误地堆积了错误,因此很明显您一直在进行零测试。即使是专业人士也无法做到这一点,更不用说初学者了。工作意味着工作,而不仅仅是编译。正如这段代码所示,很容易编写大量可编译的代码。最后学会使用调试器,它会帮助负载。显然您设置了某种复杂的客户端/服务器。忘掉那个,在你自己的机器上安装一个编译器和调试器。

isbnCode.append(reinterpret_cast<const char*>(ch));

只是错了

isbnCode += ch;

就是你想要的。除非您真的知道自己在做什么,否则不要使用 reinterpret_cast。

while (!fin.eof()) 
{ 
    fin.get(ch);

是检查文件结尾的错误方法

while (fin.get(ch)) 
{ 

就是你想要的。

其实全void setListOfIsbn(const string filename, list<Isbn> &listOfIsbn)太复杂了。这完全相同,但代码少了三倍

void setListOfIsbn(const string filename, list<Isbn> &listOfIsbn)
{
    ifstream fin(filename.c_str());
    string isbnCode;
    while (getline(fin, isbnCode))
        listOfIsbn.push_back(isbnCode);
}

此代码不正确

  string isbnCodeReform = "";
  for (i = 0; i < isbnCode.length(); itr++)
  {
     if(isalnum(isbnCode[i]))
     {
        isbnCodeReform[i] = isbnCode[i];
     }
  }

因为 isbnCodeReform 是零长度字符串所以 isbnCodeReform[i]会失败的。可能你的意思是这个

  string isbnCodeReform = "";
  for (i = 0; i < isbnCode.length(); itr++)
  {
     if(isalnum(isbnCode[i]))
     {
        isbnCodeReform.push_back(isbnCode[i]);
     }
  }

这是同样的错误

vector<int> products;
for (i = 0; i < (isbnCodeReform.length() - 1); itr++)
{
     if(isbnCodeReform[i] == 'X')
     {
        isbnCodeReform[i] = 10;
     }         

     products[i] = isbnCodeReform[i] * (10 - i);      
}

同样,产品是一个零长度数组,所以 products[i]将失败。同样,您的意思可能是类似

     products.push_back(isbnCodeReform[i] * (10 - i));

这是对迭代器工作方式的混淆

  for (itr = products.begin(); itr != products.end(); itr++)
  {
     sumOfProducts += products[*itr];
  }

你可以写

  for (itr = products.begin(); itr != products.end(); itr++)
  {
     sumOfProducts += *itr;
  }

或者你可以这样写

  for (i = 0; i < products.size(); i++)
  {
     sumOfProducts += products[i];
  }

你所拥有的是两者的混合,这是行不通的。

关于C++ 段错误 - 核心已转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16375413/

相关文章:

java - 为什么会出现 "Exception in thread "AWT-EventQueue- 0"java.lang.OutOfMemoryError: Java heap space"错误?

c++ - wxWidgets 中的奇怪注释

c++ - 虚幻引擎 5 找不到 TStaticArray

c++ - 要在我的 C++ 程序中使用 C 代码,我需要做什么特别的事情吗?

c - 我似乎无法弄清楚如何使用纯指针表示法正确传递参数

c - 如何用数字替换文件中连续出现的字符

c++ - std chrono 时间同步

c++ - 如何在 C++ 中确定 2D 无符号短指针数组长度

php - "php --help"在 Ubuntu 上导致 "PHP memory exhausted"错误

c - 从文件中扫描单词并将其保存在数组中