我可以在成员函数内的this指针上应用delete吗?

时间:2015-05-12 12:02:35

标签: c++ dynamic-allocation static-allocation

据我所知,如果使用指向动态分配的对象的指针调用了成员函数,则该对象将被删除。但是如果使用静态分配的对象调用了成员函数,那么会发生什么?

class sample
{
    int i;
  public:
    void func()
    {
        delete this;
    }
};

void main()
{
    sample *s = new sample;

    s->fun();
    sample s1;
    s1.fun();
}

3 个答案:

答案 0 :(得分:2)

只要知道指针的分配方式,删除成员函数内的指针即可。没有可移植的方法只知道指针。

如果函数传递了一个尚未动态分配的指针,并且该函数在该指针上调用delete,则它是未定义的行为。此外,即使指向分配为数组的动态对象的指针也无法使用常规delete运算符释放:您必须对它们使用delete[]。一个简单的规则是,当您不知道指针的来源时,不要在其上调用delete

答案 1 :(得分:2)

如果使用delete分配对象,则只能使用new。就那么简单。因此,您给出的第一个例子是合法的,第二个例子不是。第二种情况可能会崩溃,或者更糟糕的是,导致堆损坏并在看似随机的内存分配崩溃时远离问题。

答案 2 :(得分:-1)

如果在静态分配的对象的任何成员函数内调用delete this,则调用delete会在运行时崩溃。因为当这个对象超出范围时,编译器会自动调用析构函数,它会尝试删除不再存在的对象。