调用成员函数,尽管该对象不存在

时间:2017-05-08 16:31:56

标签: c++ object memory member

在下面的代码中,为什么我可以拨打printAlternativ而不是print? 根据我的理解,该对象应该删除,也不应该工作。

using namespace std;

class MemTest
{
public:
    MemTest(string);
    ~MemTest();
    void print();
    void printAlternative();
    string name;
};

void MemTest::print() {
    cout << "Print: " << name << "\n";
}

void MemTest::printAlternative() {
    cout << "Print Alternative\n";
}

MemTest::MemTest(string n) {
    cout << "Constructor\n";
    name = n;
}

MemTest::~MemTest() {
    cout << "Destructor\n";
}

void call(MemTest *b) {
    MemTest a("TestName");
    a.print();
    b = &a;
}

int main()
{
    MemTest *b = NULL;
    call(b);
    b->print(); // This crashes
    // b->printAlternative(); This works

    return 0;
}

1 个答案:

答案 0 :(得分:1)

在call()对象被破坏之后,所以现在对象b没有任何对象的引用,并且你试图访问对象的“name”数据成员,因为它被崩溃了。 您可以通过添加cout&lt;&lt;“测试行来验证它;电话结束后(b); main()

中的行

为什么其他人正在工作,因为成员函数与类关联并在第一次声明对象时被分配,而编译器只在destructor()中滑动数据成员