类地址与值地址不同?

时间:2015-07-06 03:55:00

标签: c++

<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()中的崩溃;

2 个答案:

答案 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赋值即可使代码运行正常。这样做是为了避免内存泄漏。