<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script>
<ul data-bind='foreach:list'>
<li class='item' data-bind='click: $root.selectItem' >
<span data-bind='text:name'></span>
</li>
</ul>
为什么此程序在class Test
{
public:
int m_value;
public:
void testA() { printf("A\n"); }
void testB() { printf("B:%d", m_value); }
};
int _tmain(int argc, _TCHAR* argv[])
{
Test* test = NULL;
test->testA();
test->testB();
return 0;
}
中崩溃,test->testB()
中的崩溃;
答案 0 :(得分:4)
在NULL指针上调用成员函数是导致未定义的行为的原因。
您的运行时环境正在宽松地处理NULL指针。对testA()
的调用不会导致任何问题,因为您没有访问任何成员变量。由于您在testB()
为NULL时尝试访问成员变量,因此对this
的调用崩溃。
从概念上讲,成员函数映射到具有以下形式的函数:
mangled_testA(Test* this){ ... }
如果在NULL指针上调用此类函数,则会调用该函数,并将this
的值设置为NULL。如果您不访问任何成员变量,则不会注意到该错误。如果您访问任何成员变量,您会立即注意到该错误。
P.S。语言无法保证此行为。这是经常发生的事情。
答案 1 :(得分:0)
我已尝试过此代码并在ideone link to code中运行它。
问题在于test =NULL
的设置,因为Object指针设置为null。这意味着该对象被赋值为NULL值,并且通常m_value将包含garbage。根据您使用的编译器,它将生成错误(运行时错误,因为它是动态分配)。 reference1 reference2
只需删除null并为m_value赋值即可使代码运行正常。这样做是为了避免内存泄漏。