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?
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通过在机器寄存器中传递值来实现.
在这种情况下,C++ this 指针可以为 NULL
this如果通过空指针调用类方法,则可以为 null。
SomeClass *a = 0;
a->someMethod();//kaboom
Run Code Online (Sandbox Code Playgroud)
虽然你绝对不应该这样做someMethod,但在实践中,如果不访问任何对象字段,你甚至可以偶然逃脱而不会崩溃(祝你好运,稍后发现) 。(只是不要这样做,好吗?)
这是否是定义的行为完全是一个不同的主题。最有可能的是未定义的行为。
然而,这通常不会在构造函数中发生(我想我只在构造函数中出现异常时才在构造函数中看到 null this 。那是很久以前发生的事情了,所以我什至不再记得细节了)。这意味着正在发生一些奇怪的事情。您可能试图将其转换为某些东西,某些东西可能会破坏堆栈,通过不同的线程访问程序变量,等等。根据您提供的大量代码,无法猜测这里的问题是什么。
| 归档时间: |
|
| 查看次数: |
6160 次 |
| 最近记录: |