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

时间:2015-07-10 08:45:13

标签: 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);
}

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

4 个答案:

答案 0 :(得分:7)

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

例如,可以通过类似

的方式来实现
  void *place = nullptr;
  MyClass *object = new (place) MyClass();

问题是这有效地取消引用了NULL指针,因此具有未定义的行为。因此MyClass构造函数可能将this设为NULL。任何其他影响也是可能的 - 这是未定义行为的本质。

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

答案 1 :(得分:2)

  

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

如果通过空指针调用类方法,

this可以为null。

SomeClass *a  = 0;
a->someMethod();//kaboom

虽然你肯定绝对不应该这样做,但在实践中,如果someMethod无法访问,你甚至可以在不崩溃的情况下侥幸逃脱(如果以后有好运)任何对象字段。 (只是不要这样做,好吗?)

是否定义了行为是一个完全不同的主题。很可能是未定义的行为。

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

答案 2 :(得分:2)

它是一个递归函数吗?如果是,则当运行时堆栈空间不足时,this可以为null。 this被推入堆栈。尝试迭代地重写函数。

class Class
{
public:
    void makeThisNull();
};

void Class::makeThisNull()
{
    makeThisNull();
}
// run this in a debugger and you will see it crash when this == 0x0 (nullptr)
int main()
{
    Class c;
    c.makeThisNull();
    return 0;
}

答案 3 :(得分:1)

根据Visual Studio,我将this作为nullptr,当我将对象包装在unique_ptr中并且没有正确初始化它,然后在其上调用一个方法来查看会发生什么。

虽然这与开场白不同,但它满足主题标题(假设VS2015不是骗我)。

这是因为我在代码之外做错了(正如其他人在别处提到的那样)。