【问题标题】:can i apply delete on this pointer inside a member function?我可以在成员函数内的这个指针上应用删除吗?
【发布时间】:2015-07-23 07:02:33
【问题描述】:

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

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

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

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

【问题讨论】:

  • 提供一个可能的例子?
  • 应该依赖于堆管理,你肯定会在尝试释放无效块时遇到错误。
  • 你尝试的结果如何?
  • 好奇为什么要让成员函数删除对象。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-08
        • 2013-11-22
        • 2014-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-19
        • 1970-01-01
        相关资源
        最近更新 更多