3

我有以下课程:

class Patient {
public:
    Patient(int x);
    ~Patient();
private:
    int* RP;
};

Patient::Patient(int x) { RP = new int [x]; }
Patient::~Patient() { delete [] RP; }

我在堆栈上创建了这个类的一个实例,如下所示:

void f() { Patient p(10); }

现在,当f()返回时,我收到“双重释放或损坏”错误,这向我发出信号,表明有人试图多次删除某些内容。但我不明白为什么会这样。数组的空间是在堆上创建的,仅仅因为分配空间的函数返回,我不希望空间被回收。

我认为如果我在堆上分配空间(使用new关键字),那么回收该空间的唯一方法是使用 delete 关键字。帮助!

根据要求,这是实际代码(为简洁起见略有删节)

这是完整的类定义(拆分为一个.cpp.h文件,但一起显示):

class Patient {

public:
    Patient(int numDecisionEpochs);

    ~Patient();

    void recordRP(const int& age, const bool& t);
    void recordBiopsy(const int& age, const int& result);
    void recordPSA(const int& age, const double& level);
    void recordPSA(const int& age);
private:
    int* RP;
    int* Biopsy;
    double* PSA;
};

Patient::Patient(int numDecisionEpochs) {
    RP = new int [numDecisionEpochs];
    Biopsy = new int [numDecisionEpochs];
    PSA = new double [numDecisionEpochs];
}

Patient::~Patient() {
    delete[] RP;
}

void Patient::recordRP(const int& age, const bool& t) {
    if(t)
    RP[age-1] = 1;  // RP either yes (1) or no (0)
    else
    RP[age-1] = 0;
}

void Patient::recordBiopsy(const int& age, const int& result) {
    switch(result)
    {
    case 0:
    case 1:
    case 2:
    case 3:
    case 4:
        Biopsy[age-1]=result; // only permit results 0,1,2,3,4
        break;
    default:
        cerr << "Invalid biopsy result (" << result << ") at age " << age << "!\n";
    }
}

void Patient::recordPSA(const int& age, const double& level) {
    PSA[age-1] = level; // record PSA volume
}

void Patient::recordPSA(const int& age) {
    PSA[age-1] = -1; // symbol for no screening during epoch
}

接下来是使用上述类的函数。以下函数直接调用main()并传递一个Policy完全独立于Patient类的对象:

void simulate1(Policy& P)
{
    // ...
    Patient patient(260);

    for(int idx=0; idx<(P.size); idx++)
    {
        while(state != 9) // while patient not dead
        {
                // ...
                patient.recordPSA(age,PSA);
                // ...
                patient.recordPSA(age);
                // ...
                patient.recordBiopsy(age,biopsyResult);
                // ...
                patient.recordRP(age,true);
                // ...
                patient.recordRP(age,false);
                // ...

        } // end patient (while loop)

    } // end sample (for loop)

} // end function
4

3 回答 3

7

您违反了三规则(或对于 C++11,违反了五规则)。您需要一个复制构造函数和复制赋值运算符来对指针进行深度复制。当然,由于您不跟踪分配的数组的大小,因此如果不引入第二个数据成员,这是不可能的。

于 2012-04-10T23:34:43.293 回答
2

这不能直接回答您的问题,但也可以考虑使用 std::vector。

于 2012-04-10T23:37:35.193 回答
0

在任何record...方法中都没有任何限制检查年龄的方法。因此,如果年龄恰好大于260或小于0您的示例中的年龄,您将超出RPorBiopsy或的范围PSA。这直接导致“双重释放或损坏”错误。

于 2012-04-10T23:48:47.010 回答