2016-07-23 3 views
1

私はcppcheckを実行しました。このクラスのコピーコンストラクタを用意する必要があります。この場合、コピーコンストラクタの定義方法はわかりません。助言がありますか?コピーコンストラクタを定義してポインタを解放する方法

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

また、私はこの機能では、次の関数で

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 
} 

可能なリークをリソースリークのエラーを取得しています:ポインタが割り当てられる前に割り当てが解除されていません。

void Simulator::setBusinessTripProbability() 
{ 

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

答えて

0

私はCppcheck開発者です。あなたはそれを削除すると良いでしょう、コピーコンストラクタを使用する予定がない場合は

Simulator(const Simulator &sim); 

:コピーコンストラクタを作成するには

Simulator(const Simulator &) = delete; 

リソースリーク:あなたがfcloseを使用する必要があります( INPUTFILE)

可能なリーク:

Simulator simulator; 
simulator.setBusinessTripPossibility(); 
simulator.setBusinessTripPossibility(); 
:このコードを想像してみて

ここにはメモリリークがあります。 businessTripProbabilityは2回割り当てられ、割り振り解除はありません。パブリックメソッドsetBusinessTripPossibility()が決して2回呼び出されないという規則があるかもしれません。しかし、私の謙虚な意見では、そのようなルールでクラスを設計すべきではありません。パブリッククラスインタフェースを任意に使用できるようにしてください。

関連する問題