在这种情况下,C++ this指针可以为NULL

use*_*083 9 c++ constructor this

我在使用此指针时遇到了类构造函数中的问题,但此时此指针恰好为NULL.例如

MyClass::MyClass()
{
   //this pointer happen to be NULL in this case, and it crash in teh m_callbackfunc because it does not handle null input.
   m_callbackFunc(this);
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么这个指针可以为null?在这种情况下,这个指针可以为null?

Pet*_*ter 7

this指针可以为NULL 的唯一方法是程序中的某些代码是否显示未定义的行为.

例如,可以通过类似的方式来实现

  void *place = nullptr;
  MyClass *object = new (place) MyClass();
Run Code Online (Sandbox Code Playgroud)

问题是这有效地解除引用NULL指针,因此具有未定义的行为.因此MyClass构造函数可能具有thisNULL.任何其他效果也是可能的 - 这是未定义行为的本质.

一些调试器也报告this为NULL指针.但这实际上并不是thisNULL 的标志.它是一个符号,它this是一个语言关键字,而不是调试器可以找到的目标文件中具有符号名称的符号.当被要求评估时,其他一些调试器this只是报告在当前函数/作用域/无论什么时候存在该名称的任何内容 - 可能是因为C++编译器this通过在机器寄存器中传递值来实现.


Sig*_*erm 7

在这种情况下,C++ this 指针可以为 NULL

this如果通过空指针调用类方法,则可以为 null。

SomeClass *a  = 0;
a->someMethod();//kaboom
Run Code Online (Sandbox Code Playgroud)

虽然你绝对不应该这样做someMethod,但在实践中,如果不访问任何对象字段,你甚至可以偶然逃脱而不会崩溃(祝你好运,稍后发现) 。(只是不要这样做,好吗?)

这是否是定义的行为完全是一个不同的主题。最有可能的是未定义的行为。

然而,这通常不会在构造函数中发生(我想我只在构造函数中出现异常时才在构造函数中看到 null this 。那是很久以前发生的事情了,所以我什至不再记得细节了)。这意味着正在发生一些奇怪的事情。您可能试图将其转换为某些东西,某些东西可能会破坏堆栈,通过不同的线程访问程序变量,等等。根据您提供的大量代码,无法猜测这里的问题是什么。

  • @EdHeal:那是吹毛求疵。如果您想要更多挑剔,问题会询问何时可以为空。当构造函数中 this 可以为 null 时则不会。 (4认同)
  • 问题是使用构造函数。即不是一个方法 (2认同)
  • 它正在调用一个参数为“this”的函数。这发生在构造函数中。那么这可以为空吗?你的回答没有回答问题 (2认同)