如何定义复制构造函数和释放指针

时间:2016-07-23 17:09:21

标签: class pointers constructor destructor allocation

我运行了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]

1 个答案:

答案 0 :(得分:1)

我是Cppcheck开发人员。

创建复制构造函数:

 Simulator(const Simulator &sim);

如果您不打算使用复制构造函数,最好将其删除:

Simulator(const Simulator &) = delete;

资源泄漏:您需要使用fclose(inputfile)

可能泄漏:想象一下这段代码:

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

这里有内存泄漏。 businessTripProbability分配两次,没有释放。您可能有一条规则,即公共方法setBusinessTripPossibility()永远不会被调用两次。但在我看来,你不应该设计有这种规则的课程。尽量允许任意使用公共类接口。