简体   繁体   English

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

[英]Is there a memory leak in the following c++ code?

I am writing my program for my DataMining project. 我正在为我的DataMining项目编写程序。 I get segmentation error on my code. 我的代码出现分段错误。 I tried to debug using the gdb and created core dump using ulimit in ubuntu. 我尝试使用gdb进行调试,并在ubuntu中使用ulimit创建了核心转储。

Below is the error I was able to backtrace in gdb. 以下是我能够在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

My code: 我的代码:

/*********************************************************
 * 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;
}

I am calling my classes through a main function which looks like 我通过一个看起来像这样的主函数来调用我的类

 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); } 

}

if you are building it for Window, you would be able to use the build in data leak code they provided for Visual Studioes(I have not tested the code outside Visual Basics) 如果要为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

This code will make sure of any memorey leaks are cleaned up and the blocks wont be removed. 此代码将确保清除所有备忘录泄漏,并且不会删除这些块。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM