【问题标题】:Deleting this pointer from constructor [duplicate]从构造函数中删除此指针[重复]
【发布时间】:2019-12-29 01:01:29
【问题描述】:

我尝试从构造函数中删除这个指针,然后当我通过成员函数访问私有变量时,变量被正确获取。

如果我再次尝试删除它(在构造函数或 func() 中),我的程序会崩溃。这意味着这个指针在构造函数中被删除了。

class B
{
    int a;
public:
    B()
    {
        std::cout << this;
        std::cout << "\nConstructor\n";
        delete this;
        a = 5;
        std::cout << "\n" << this;
    }
    ~B()
    {
        std::cout << "Destructor\n";
    }
    void func()
    {
        std::cout << "\n" << a << " Func\n";
    }
};

int main(int argc, char* argv[])
{
    B *b = new B();
    b->func();
    return 0;
}

但调用 func() 会打印正确的输出。由于删除了这个,我预计会出现一些错误。为什么 func() 的隐式参数在删除时没有更新?

【问题讨论】:

  • 在调用delete this; 后访问对象是未定义的行为 (UB)。这正是它所说的,你错误地期待一个错误。这是初学者最常见的误解之一,“我写了一些糟糕的代码,为什么不是错误?” C++ 不能那样工作。
  • 你想达到什么目的?这是未定义的行为。任何事情都有可能发生。
  • 使用valgrind 或任何其他消毒剂运行它,您会发现错误。
  • UB 不合理。它可以做任何可以想象的事情,包括最坏的情况:看似有效。
  • 我无法想象构造函数中的delete this; 可以工作的场景。

标签: c++ constructor this


【解决方案1】:

delete this 是允许的并且很好。但是,在删除类后访问该类的任何成员是不允许的,并且是未定义的行为。您的代码似乎可以工作是 UB 可以采用的一种形式。

【讨论】:

  • 如果在栈上创建了B的实例,delete this不会导致UB吗?似乎delete this 只有在使用new 创建实例时才有效。
  • @Romen 是的,我的意思是在这种情况下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 2016-10-13
  • 2010-10-21
  • 2016-04-13
  • 2011-02-09
  • 1970-01-01
  • 2018-03-21
相关资源
最近更新 更多