【发布时间】: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