调用成员函数,虽然对象不存在

问题描述:

在下面的代码中,为什么我可以调用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; 
} 
+9

欢迎未定义行为的土地得到分配。唯一的规则是没有规则。 – NathanOliver

+0

曾听说过'new'运算符 – Sniper

+5

简短回答 - 因为'printAlternativ'不访问类的任何成员,所以不需要_technically_实例。但是这并不保证能奏效。 – icabod

后()调用对象得到破坏,所以现在对象B没有任何对象的任何引用,您尝试访问对象的“名称”数据成员,因为它得到坠毁。 您可以通过添加一个cout < <“测试线”来验证它; (b)之后;在线路的main()

为什么另一种是工作,因为成员函数与类相关联,当我们第一次申报对象和编译器在析构函数只刷卡数据成员()

+0

我可以依靠这种行为,因为它似乎是你建议这是行为是由设计。你有没有任何证据,因为我没有找到任何证据。 – Gasare

+0

正如我们所知,函数只在内存中初始化一次,并且对每个对象都有效,只有在每次调用数据时才会更改堆栈。因为那个析构函数没有刷过功能。 –