我可以在成员函数中的此指针上应用删除吗?



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

class sample
{
    int i;
  public:
    void func()
    {
        delete this;
    }
};
void main()
{
    sample *s = new sample;
    s->fun();
    sample s1;
    s1.fun();
}

只要您知道如何分配该指针,就可以删除成员函数中的指针。没有一种便携式的方式可以仅仅从指针出发。

如果通过一个尚未动态分配的指针传递,并且该函数在该指针上调用delete,则是未定义的行为。此外,即使是针对分配为数组的动态对象的指针也不能与常规delete操作员一起释放:您必须在它们上使用delete[]。一个简单的规则是,当您不知道指针的起源时,您不在其上调用delete

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

如果在静态分配的对象的任何成员函数中调用此删除,则调用delete delete将在运行时崩溃。因为当此对象脱离范围时,编译器将自动调用destructor,它将尝试删除不再存在的对象。

相关内容

  • 没有找到相关文章

最新更新