c++ - 堆摘要错误中不匹配

标签 c++ pointers

我知道我不需要担心 Still reachable bytes,但这种情况不同。

我的文件: wscramble_fio.cpp

// wscramble.cpp
// Word Scramble guessing game
// Illustrates string library functions, character arrays,
// arrays of pointers, etc.
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <string>
#include <fstream>

using namespace std;

// Prototype
void permute(char items[], int len);

// Define an array of strings (since a string is just a char array)
// and since string are just char *'s, we really want an array of char *'s


int main(int argc, char * argv[])
{
  if (argc != 2)
  {
    cout << "Usage : " << argv[0] << "<wordbankFile>" << endl ;
    return -1 ;
  }

  ifstream inputFile ;
  inputFile.open(argv[1]);

  if (!inputFile.is_open())
  {
    cout << "Error opening file : " << argv[1] << endl ;
    return -1 ;
  }

  int wordCount = 0 ;

  inputFile >> wordCount ;
  if (inputFile.fail())
  {
    cout << "File format incorrect" << endl ;
    return -1 ;
  }

  // Ignore the \n following the number.
  //inputFile.ignore(1024, '\n') ;

  char ** wordBank = new char* [wordCount] ;
  char buffer[41] ;
  int i = 0 ;
  while (!inputFile.eof())
  {
    inputFile >> buffer ;
    //cout << buffer ;
    if (strcmp(buffer,"\n") == 0 || strcmp(buffer," ") == 0 || strcmp(buffer, "") == 0)
    {
      continue ;
    }

    if (i >= wordCount)
    {
      cout << "Too many words in the file" << endl ;
      inputFile.close() ;
      return -1 ;
    }
    wordBank[i] = new char [strlen(buffer)+1] ;
    strcpy(wordBank[i],buffer) ;
    buffer[0] = '\0' ;
    i++ ;
  }

  for (int i = 0 ; i < wordCount ;i++)
  {
    cout << wordBank[i] << endl ;
  }

  srand(time(0));
  char guess[80];

  bool wordGuessed = false;
  int numTurns = 10;

  // Pick a random word from the wordBank
  int target = rand() % wordCount;
  int targetLen = strlen(wordBank[target]);

  // More initialization code
  char* word = new char[targetLen+1];
  strcpy(word, wordBank[target]);
  permute(word, targetLen);

  // An individual game continues until a word
  // is guessed correctly or 10 turns have elapsed
  while ( !wordGuessed && numTurns > 0 ){
    cout << "\nCurrent word: " << word << endl;
    cin >> guess;
    wordGuessed = (strncmp(guess, wordBank[target], targetLen+1) == 0);
    numTurns--;
  }
  if(wordGuessed){
    cout << "You win!" << endl;
  }
  else {
    cout << "Too many turns...You lose!" << endl;
  }


  /* This would go at the end of program. For now i m just writing here */
  for (int i = 0 ; i < wordCount ; i++)
  delete (wordBank[i]) ;
  delete [] wordBank ;
  inputFile.close() ;
}

// Scramble the letters
void permute(char items[], int len)
{
  for(int i=len-1; i > 0; --i){
    int r = rand() % i;
    int temp = items[i];
    items[i] = items[r];
    items[r] = temp;
  }

}

词库.txt

6 
cs103 trojan
midterm 
aced 
perfect 
score

当我使用命令时:

valgrind --tool=memcheck --leak-check=yes ./wscramble_fio wordbank.txt

valgrind 命令产生以下输出。

     ==10409== Mismatched free() / delete / delete []
==10409==    at 0x4C2BADC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10409==    by 0x4015D7: main (in /home/simpleguy/CCPP/wscramble_fio)
==10409==  Address 0x5a1c550 is 0 bytes inside a block of size 5 alloc'd
==10409==    at 0x4C2AFE7: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10409==    by 0x401489: main (in /home/simpleguy/CCPP/wscramble_fio)
==10409== 
==10409== Mismatched free() / delete / delete []
==10409==    at 0x4C2BADC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10409==    by 0x401608: main (in /home/simpleguy/CCPP/wscramble_fio)
==10409==  Address 0x5a1c370 is 0 bytes inside a block of size 6 alloc'd
==10409==    at 0x4C2AFE7: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==10409==    by 0x40135D: main (in /home/simpleguy/CCPP/wscramble_fio)
==10409== 
==10409== 
==10409== HEAP SUMMARY:
==10409==     in use at exit: 0 bytes in 0 blocks
==10409==   total heap usage: 10 allocs, 10 frees, 8,853 bytes allocated
==10409== 
==10409== All heap blocks were freed -- no leaks are possible
==10409== 
==10409== For counts of detected and suppressed errors, rerun with: -v
==10409== ERROR SUMMARY: 7 errors from 2 contexts (suppressed: 2 from 2)

最佳答案

您应该在 valgrind 下使用选项“--leak-check=full --show-reachable=yes”重新运行您的程序,以获取泄漏处的完整堆栈跟踪。这是 Valgrind 在上述报告中提出的建议。

$ valgrind --tool=memcheck --leak-check=full --show-reachable=yes ./wscramble_fio wordbank.txt

如果您想在 Valgrind 检测到泄漏时通过调试器附加,以便您可以进行实时调试,您应该使用以下命令:

$ valgrind --tool=memcheck --leak-check=yes --db-attach=yes ./wscramble_fio wordbank.txt

通过这种方式,每当 valgrind 遇到错误时,您的程序将自动被 GDB 附加。

关于c++ - 堆摘要错误中不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22085629/

相关文章:

c++ - 使两个物体朝向同一方向(计算机可视化)

c++ - std::thread 和异常处理

c++ - Long Pointer to Constant Wide String,这里Long的作用是什么?

c - 需要左值作为递增操作数

c++ - 如何在 C/C++ 程序中执行 sudo 命令?

c++ - 在一个 for 循环中创建多个结构体

c++ - 读取映射到内存的 CSV 文件的最简单方法?

pointers - 在 Fortran 中传递指针参数

pointers - 字符数组的二维数组PROGMEM Arduino

c++ - 为变量创建拷贝