【发布时间】:2017-05-08 16:31:55
【问题描述】:
在下面的代码中,为什么我可以调用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;
}
【问题讨论】:
-
欢迎来到未定义行为领域。唯一的规则是没有规则。
-
听说过
new运营商 -
简短回答 - 因为
printAlternativ不访问该类的任何成员,因此技术上不需要实例。但这不能保证有效。 -
call函数对main中的变量b没有影响——b始终是空指针。 -
@Sniper 是的,但这不是我的问题。我只是将其视为未定义的行为,因为我没有找到任何其他解释。