2016-04-07 40 views
0

Kendimi zor bir durumda buluyorum. Dinamik olarak ayrılan herhangi bir belleği silmesi gereken bir programım var, ancak ilgili yöntemleri çağırmaya çalıştığımda bellek yığınının bozulmasına neden oluyor.Bellek sızıntısı ile ilgili sorunlar

Yöntemleri aramadığımda işe yarayabilir, ancak büyük olasılıkla bir ton bellek sızıntısına neden oldum. Ne olup bittiği hakkında bir fikrin var mı?

kodu aşağıdaki gibidir:

CSVFile.h:

#pragma once 

class InputPattern; 
class OutputPattern; 

class CSVFile 
{ 
private: 
    const int NAME_MAX = 100; 
    char* name; 
    char** buffer; 
    bool loadedFlag; 
    int patternCount; 
    InputPattern** inputs; 
    OutputPattern** outputs; 

    void setLoadedFlagTrue(); 
    void setLoadedFlagFalse(); 
public: 
    CSVFile(); 
    ~CSVFile(); 
    CSVFile(const char*); 

    void setName(const char*); 
    char* getFilename(char*, int); 

    bool getLoadedFlag(); 
    int loadFile(); 

    InputPattern* getInputPattern(int); 
    OutputPattern* getOutputPattern(int); 

    void addInputPattern(InputPattern*); 
    void addOutputPattern(OutputPattern*); 
    void deleteInputPattern(); 
    void deleteOutputPattern(); 

    void printMetaData(); 
    void printPatterns(); 
    void deleteBuffer(); 
}; 

CSVFile.cpp:

#include "CSVFile.h" 
#include "InputPattern.h" 
#include "OutputPattern.h" 
#include <stdio.h> 
#include <string.h> 

void CSVFile::setLoadedFlagTrue() 
{ 
    loadedFlag = true; 
} 

void CSVFile::setLoadedFlagFalse() 
{ 
    loadedFlag = false; 
} 

CSVFile::CSVFile() 
{ 
    name = NULL; 
    buffer = NULL; 
    inputs = NULL; 
    outputs = NULL; 
    patternCount = 0; 

    inputs = new InputPattern*[10]; 
    outputs = new OutputPattern*[10]; 
    buffer = new char*[4]; 

    int i; 
    for (i = 0; i < 10; i++) 
    { 
     inputs[i] = new InputPattern(); 
     outputs[i] = new OutputPattern(); 
     buffer[i] = new char[NAME_MAX]; 
    } 
} 

CSVFile::~CSVFile() 
{ 
    delete name; 
    name = NULL; 
} 

CSVFile::CSVFile(const char * filename) 
{ 
    name = NULL; 
    buffer = NULL; 
    inputs = NULL; 
    outputs = NULL; 
    patternCount = 0; 

    inputs = new InputPattern*[10]; 
    outputs = new OutputPattern*[10]; 

    int i; 
    for (i = 0; i < 10; i++) 
    { 
     inputs[i] = new InputPattern(); 
     outputs[i] = new OutputPattern(); 
    } 

    name = new char[NAME_MAX]; 
    strcpy(name, filename); 
} 

void CSVFile::setName(const char * filename) 
{ 
    name = new char[NAME_MAX]; 
    strcpy(name, filename); 
} 

char* CSVFile::getFilename(char * outBuff, int outBuffSize) 
{ 
    outBuff = new char[outBuffSize + 1]; 
    strncpy(outBuff, name, outBuffSize); 
    return outBuff; 
} 

bool CSVFile::getLoadedFlag() 
{ 
    if (name == NULL) 
    { 
     setLoadedFlagFalse(); 
     return loadedFlag; 
    } 

    if (patternCount == 10) 
     setLoadedFlagTrue(); 
    else 
     setLoadedFlagFalse(); 

    return loadedFlag; 
} 

int CSVFile::loadFile() 
{ 
    FILE* f; 
    if ((f = fopen(name, "r")) == NULL) 
    { 
     printf("File failed to open\n"); 
     return 0; 
    } 

    for (patternCount = 0; patternCount < 4; patternCount++) 
    { 
     fgets(buffer[patternCount], 100, f); 
    } 

    patternCount = 0; 
    /*ask about input interaction; potentially remove these variables afterwards*/ 
    float tIn, rIn, gIn, bIn, tOut, oOut; 

    /*might change this to make it more flexible*/ 
    while (patternCount < 10) 
    { 
     fscanf(f, "%f,%f,%f,%f,%f,%f", &tIn, &rIn, &gIn, &bIn, &tOut, &oOut); 
     printf("%f,%f,%f,%f,%f,%f\n", tIn, rIn, gIn, bIn, tOut, oOut); 

     inputs[patternCount]->setT(tIn); 
     inputs[patternCount]->setR(rIn); 
     inputs[patternCount]->setG(gIn); 
     inputs[patternCount]->setB(bIn); 
     outputs[patternCount]->setT(tOut); 
     outputs[patternCount]->setO(oOut); 

     patternCount++; 
    } 
    fclose(f); 
    return patternCount; 
} 

InputPattern * CSVFile::getInputPattern(int index) 
{ 
    if (index >= 0 && index < 10) 
     return inputs[index]; 
    else 
     return 0; 
} 

OutputPattern * CSVFile::getOutputPattern(int index) 
{ 
    if (index >= 0 && index < 10) 
     return outputs[index]; 
    else 
     return 0; 
} 

void CSVFile::addInputPattern(InputPattern * in) 
{ 
    inputs[patternCount] = in; 
    patternCount++; 
} 

void CSVFile::addOutputPattern(OutputPattern * out) 
{ 
    outputs[patternCount] = out; 
    patternCount++; 
} 

void CSVFile::deleteInputPattern() 
{ 
    int i; 
    for (i = 0; i < patternCount; i++) 
    { 
     delete inputs[i]; 
    } 

    delete inputs; 
    inputs = NULL; 
} 

void CSVFile::deleteOutputPattern() 
{ 
    int i; 
    for (i = 0; i < patternCount; i++) 
    { 
     delete outputs[i]; 
    } 

    delete outputs; 
    outputs = NULL; 
} 

void CSVFile::printMetaData() 
{ 
    int i; 
    for (i = 0; i < 4; i++) 
    { 
     printf("%s", buffer[i]); 
    } 
} 

void CSVFile::printPatterns() 
{ 
    /*to be completed*/ 
    int i; 
    for (i = 0; i < patternCount; i++) 
    { 
     printf("Class number %d\n", i + 1); 

     printf("T in = %f\n", inputs[i]->getT()); 
     printf("R in = %f\n", inputs[i]->getR()); 
     printf("G in = %f\n", inputs[i]->getG()); 
     printf("B in = %f\n", inputs[i]->getB()); 

     printf("T out = %f\n", outputs[i]->getT()); 
     printf("O out = %f\n", outputs[i]->getO()); 
    } 
} 

void CSVFile::deleteBuffer() 
{ 
    int i; 
    for (i = 0; i < patternCount; i++) 
    { 
     delete buffer[i]; 
    } 

    delete buffer; 
    buffer = NULL; 
} 

TestHarness.cpp örneği (bu ana işlevi yürütülür)

}

+10

Tekerleği yeniden icat etmeyin. 'Std :: string' ve' std :: vector' komutlarını kullanın ve tüm bellek yönetimini sizin için halledin. – NathanOliver

+2

Yolsuzluk bozulması genellikle silme koduna girmeden önce olur. Yetkisizleştirme koduna girdiğinizde çok geç. Olduğunda onları yakalamak için [valgrind] (http://valgrind.org/) gibi bir bellek profiler kullanın. – dasblinkenlight

+1

Bunlardan 4'ü yaparsınız: arabellek = new char * [4]; 've sonra bunlardan 10'unu döngüde ayırırsınız. – Galik

cevap

0

sadece ana yönteme dışında

#define _CRTDBG_MAP_ALLOC
#include<crtdbg.h>

struct AtExit 
{ 
    ~AtExit() 
    { 
     _CrtDumpMemoryLeaks(); 
    } 
}doAtExit; 

ile hafıza sızıntıları kontrol edebilirsiniz.

Programınız her bittiğinde çalışır. Tüm gerçekten gerçekten bir bellek sızıntısı olup olmadığını gösterir. Aslında onları bulmakta yardımcı olmuyor. Bunun için Visual Studio'ya ihtiyacınız olabilir. This is how it looks when a memory leak is found