调用成员函数,虽然对象不存在
问题描述:
在下面的代码中,为什么我可以调用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;
}
答
后()调用对象得到破坏,所以现在对象B没有任何对象的任何引用,您尝试访问对象的“名称”数据成员,因为它得到坠毁。 您可以通过添加一个cout < <“测试线”来验证它; (b)之后;在线路的main()
为什么另一种是工作,因为成员函数与类相关联,当我们第一次申报对象和编译器在析构函数只刷卡数据成员()
+0
我可以依靠这种行为,因为它似乎是你建议这是行为是由设计。你有没有任何证据,因为我没有找到任何证据。 – Gasare
+0
正如我们所知,函数只在内存中初始化一次,并且对每个对象都有效,只有在每次调用数据时才会更改堆栈。因为那个析构函数没有刷过功能。 –
欢迎未定义行为的土地得到分配。唯一的规则是没有规则。 – NathanOliver
曾听说过'new'运算符 – Sniper
简短回答 - 因为'printAlternativ'不访问类的任何成员,所以不需要_technically_实例。但是这并不保证能奏效。 – icabod