以下c ++代码中是否存在内存泄漏?

时间:2015-05-30 03:11:20

标签: c++ c++11 memory-leaks segmentation-fault coredump

我正在为我的DataMining项目编写程序。我的代码出现分段错误。我尝试使用gdb进行调试,并在ubuntu中使用ulimit创建了核心转储。

以下是我能够在gdb中回溯的错误。

Python Exception <class 'gdb.MemoryError'> Cannot access memory at address 0x7fff48c47738: #0  0x000000000040cdb0 in TokenReader::getToken (
this=<error reading variable: Cannot access memory at address 0x7fff48c47718>, 
this@entry=<error reading variable: Cannot access memory at address 0x7fff48c47738>, 
buf=<error reading variable: Cannot access memory at address 0x7fff48c47710>, 
buf@entry=<error reading variable: Cannot access memory at address 0x7fff48c47738>) at src/tokread.c++:26
Cannot access memory at address 0x7fff48c47738

我的代码:

/*********************************************************
 * Project: 2
 * File: tokread.h
 * Anil Pediredla, KUID 28056
 *********************************************************/

#ifndef _TOKREAD_H_
#define _TOKREAD_H_

#include <iostream>
using namespace std;

const short NEW_LINE = 0;
const short SPACE    = 1;
const short TOKEN    = 2;
const short COMMENT  = 3;

class TokenReader {
  public:

    TokenReader(istream &in);

    char* getToken(char* buf);

  private:
    istream &in;
    short state;
};



#endif //_TOKREAD_H_

/*********************************************************
 * Project: 2
 * File: tokread.h
 * Anil Pediredla, KUID 28056
 *********************************************************/

#include <sstream>
#include <cstdlib>

using namespace std;

#include "tokread.h"


/*********************************************************
 * Class: TokenReader
 *********************************************************/
TokenReader::TokenReader(istream &in):
  in(in), state(NEW_LINE) {
}


char* TokenReader::getToken(char* buf) {
  bool done = false;
  int tokLen = 0;
  while (!done && !in.eof()) {           //error here
    char ch = in.get();
    switch (state) {
      case NEW_LINE:
        if (ch == '!') state = COMMENT;
        else {
          in.unget();
          state = SPACE;
        }
      break;
      case SPACE: 
        if ((ch == 13) && (in.peek() == '\n')) in.get();
        if (ch == '\n') {
          state = NEW_LINE;
          break;
        }
        if ((ch != ' ') && (ch != '\t')) {
          in.unget();
          state = TOKEN;
        }
      break;
      case TOKEN:
        if ((ch == 13) && (in.peek() == '\n')) in.get();
        if (ch == '\n') {
          state = NEW_LINE;
          done = true;
          break;
        }
        if ((ch == ' ') || (ch == '\t')) {
          in.unget();
          state = SPACE;
          done = true;
          break;
        }
        buf[tokLen++] = ch;
      break;
      case COMMENT:
       if (ch == '\n'){
           state = NEW_LINE;
       }
      break;
    }
  }
  buf[tokLen] = '\0';
  return buf;
}

我通过一个看起来像

的主函数来调用我的类

int main(int argc, char* argv[]) {

  fstream input(inFileName, ios::in);
  if (!input) {
    cerr << "Could not open file " << inFileName << endl;
    exit(-1);
/* calling my error class here. 
*/  
  TokenReader reader(input);
  Table* table = new Table(reader, maxDistAttrVal);

  table->mlem2(intvFormat, output1, output2, output3);

}

int main(int argc, char* argv[]) { fstream input(inFileName, ios::in); if (!input) { cerr << "Could not open file " << inFileName << endl; exit(-1); /* calling my error class here. */ TokenReader reader(input); Table* table = new Table(reader, maxDistAttrVal); table->mlem2(intvFormat, output1, output2, output3); }

1 个答案:

答案 0 :(得分:0)

如果您正在为Window构建它,您将能够使用它们为Visual Studioes提供的数据泄漏代码(我没有在Visual Basics之外测试代码)

   //-----MICROSOFT ONLY----------
  #define _CRT_DEBUG_MAP_ALLOC
  #include <crtdbg.h> //C-runtime debug header 
 //must be placed before include's
 //------------------------------

 //Must be place at the top of your main method
 #if defined(_DEBUG)
int dbgFlags = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
dbgFlags |= _CRTDBG_CHECK_ALWAYS_DF; //check block intergerity on every memory
dbgFlags |= _CRTDBG_DELAY_FREE_MEM_DF; //dont remove blocks on delete
dbgFlags |= _CRTDBG_LEAK_CHECK_DF; //check for leaks at process termination
_CrtSetDbgFlag(dbgFlags);
#endif

此代码将确保清除任何memorey泄漏并且不会删除块。