我在使用此指针时遇到了类构造函数中的问题,但此时此指针恰好为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?在这种情况下,这个指针可以为空?
答案 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不是骗我)。
这是因为我在代码之外做错了(正如其他人在别处提到的那样)。