2016-07-23 29 views
1

Ich habe cppcheck ausgeführt, und es stellt sich heraus, dass ich einen Kopierkonstruktor für diese Klasse haben muss. Ich weiß nicht, wie man in diesem Fall einen Kopierkonstruktor definiert. Irgendwelche Vorschläge?Wie definiert man den Kopierkonstruktor und gibt den Zeiger frei

class Simulator{ 


    private: 

     int xMax;// = 40; //SIZE; 
     int yMax;// = 40; //xMax; // 40 
     //int TTMxSize = 4000; 
     //const int CarMxSize = 500; 
     //const int WaitListSize = 4000; 
     double base_price;// = 0.85/4; 
     double saev_vott;// = 0.35; 
     char* mode_output;// = "modeChoiceStats_supply_charge.csv";  

     vector<Car>** CarMx;//[xMax][yMax]; 
     vector <Station>** ChStMx;//[xMax][yMax]; 
     vector<int> **cellChargeCount; 
      vector<int> **cellChargeTime; 
     int timeTripCounts [288];   

     // Functions for program 

    public: 
     Simulator(); 
     Simulator(int fleet_size, int seed, char* inputFile); 
     ~Simulator(); 
     bool loadParameters(char* input); 
     void printParameters(); 
     void placeInitCars(); 
    bool lookForCar (int x, int y, int r, int dist, int& cn); 
    void assignCar (int x, int y, int c, Trip* trp); 
void setBusinessTripProbability(); 

     void runSimulation(); 
}; 

Simulator::~Simulator() 
{ 
    for (int x=0; x<xMax; x++) 
    { 
     delete [] CarMx[x]; 
     delete [] ChStMx[x]; 
     delete [] cellChargeCount[x]; 
     delete [] cellChargeTime[x]; 
    } 

    for (int x=0; x<numZonesL; x++) 
     delete [] zoneSharesL[x]; 

    for (int x=0; x<numZonesS; x++) 
     delete [] zoneSharesS[x]; 

    delete [] CarMx; 
    delete [] ChStMx; 
    delete [] cellChargeCount; 
    delete [] cellChargeTime; 
    delete [] zoneSharesL; 
    delete [] zoneSharesS; 
} 

Auch ich bin immer Ressource-Mangel Fehler in der folgenden Funktion

bool Simulator::loadParameters(char* input) 
{ 
    FILE* inputfile; 
    inputfile = fopen(input, "r"); 
    if (inputfile == NULL){ 
    cout << "Could not open "<<input<<endl; 
    return false; 
    } 
    double inputVal = -1.0; 
    char* varStr; 
    char* valStr; 
    char instring [80]; 

    while (!feof(inputfile)) 
    { 
     fgets(instring, 80, inputfile); 
     comment = instring[0]; 
     if (comment != '#' && comment != '\n') 
     { 
      varStr = strtok(instring, "="); 
      valStr = strtok(NULL, "\0"); 

     if (strcmp (varStr, "xMax") == 0) { 
     inputVal = strtod(valStr, NULL); 
     xMax = 4 * (int) inputVal; 
     } else if (strcmp (varStr, "yMax") == 0) { 
     inputVal = strtod(valStr, NULL); 
     yMax = 4 * (int) inputVal; 
      } 
    } 
    return true; <<<<<<<<< RESOURCE LEAK: inputfile 
} 

mögliches Leck in dieser Funktion: Zeiger wird nicht freigegeben, bevor zugeordnet ist.

void Simulator::setBusinessTripProbability() 
{ 

    businessTripProbability = new double[926]; 
    businessTripProbability [  0  ] = 0.0000 ; 
    businessTripProbability [  1  ] = 0.0029 ; 
    businessTripProbability [  2  ] = 0.0059 ;........... until [925] 

Antwort

0

Ich bin ein Cppcheck-Entwickler.

Um eine Kopie Konstruktor zu erstellen:

Simulator(const Simulator &sim); 

Wenn Sie den Copy-Konstruktor nicht verwenden möchten, ist es besser, es zu löschen:

Simulator(const Simulator &) = delete; 

Leck Ressource: Sie fclose verwenden müssen (Eingabedatei)

Mögliches Leck: dieser Code Stellen Sie sich vor:

Simulator simulator; 
simulator.setBusinessTripPossibility(); 
simulator.setBusinessTripPossibility(); 

Hier ist ein Speicherleck vorhanden. Die BusinessTripProbability wird zweimal zugewiesen und es gibt keine Freigabe. Sie haben möglicherweise eine Regel, dass die öffentliche Methode setBusinessTripPossibility() niemals zweimal aufgerufen wird. Aber meiner bescheidenen Meinung nach sollten Sie keine Klassen mit einer solchen Regel entwerfen. Versuchen Sie, die öffentliche Klassenschnittstelle willkürlich zu verwenden.