1

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

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

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

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

3 回答 3

3

只要您知道该指针是如何分配的,就可以删除成员函数内的指针。仅凭一个指针就没有可移植的方式来了解这一点。

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

于 2015-05-12T12:06:08.703 回答
2

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

于 2015-05-12T12:46:37.740 回答
-1

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

于 2015-05-12T12:26:20.807 回答