永发信息网

析构函数中delete释放指针时出错。

答案:2  悬赏:10  手机版
解决时间 2021-02-18 08:06
  • 提问者网友:像風在裏
  • 2021-02-17 09:58
#include 
#include 

class Frames
{
public:

    int len;
    int *begFrames;
    int *endFrames;

    Frames(int n);
    ~Frames();
    int printFrames();
};

Frames::Frames(int n)
{
    len = n;
    begFrames = new int[n];
    endFrames = new int[n];
}
Frames::~Frames()
{

    if (begFrames != NULL)
    {
        delete [] begFrames;          //执行到这里的时候会报错
        cout << "destructor begFrames" << endl;
    }

    if (endFrames != NULL)
    {
        delete [] endFrames;
        cout << "destructor endFrames" << endl;
    }
    cout << "destructor " << this << endl;
}
Frames::printFrames()
{
    printf("begFrames:\n");
    for (int i=0; i        printf("%d  ",begFrames[i]);

    printf("\nendFrames:\n");
    for (i=0; i        printf("%d  ",endFrames[i]);

    return 0;
}

int main()
{
    int beg[4]={1,2,3,4};
    int end[4]={6,7,8,9};

    Frames *arrFrames=new Frames(4);
    arrFrames->begFrames=beg;
    arrFrames->endFrames=end;

    arrFrames->printFrames();

    delete arrFrames;
    return 0;
}
注释掉析构函数中的两个delete就没报错,这是什么原因?请问怎么改?
最佳答案
  • 五星知识达人网友:轻雾山林
  • 2021-02-17 11:20
析构函数中应该是这样:(假设char*变量名是str) if(str!=NULL)delete[]str; 因为你是在成员函数中new的,有可能在你销毁对象时str并没有分配内存,而你却视图释放它指向的内存,当然会出错。加上if判断后就可以避免这种情况。
全部回答
  • 1楼网友:青尢
  • 2021-02-17 12:48
如果函数不是 virtual 的,则进行的是静态绑定,即在编译期间就决定了其调用的函数。 对于上面的程序来说, delete bp2;,即使基类指针bp2实际上指向的是派生类对象,但是编译器也会把这个基类指针和指向类型(基类)的析构函数进行静态绑定,从而达不到调用派生类析构函数的目的。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯