调用成员函数,虽然对象不存在
Call the member function, although the object does not exist
在下面的代码中,为什么我可以调用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;
}
在 call() 对象被破坏后,现在对象 b 没有任何对象的任何引用,并且您正在尝试访问对象的 "name" 数据成员,因为它崩溃了。
您可以通过添加 cout<<"Test line"; 来验证它通话后(b); main() 中的行
以及为什么另一个能正常工作,因为成员函数与 class 相关联,并且在我们第一次声明对象和编译器时仅在析构函数 ()
中刷数据成员时被分配
在下面的代码中,为什么我可以调用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;
}
在 call() 对象被破坏后,现在对象 b 没有任何对象的任何引用,并且您正在尝试访问对象的 "name" 数据成员,因为它崩溃了。 您可以通过添加 cout<<"Test line"; 来验证它通话后(b); main() 中的行
以及为什么另一个能正常工作,因为成员函数与 class 相关联,并且在我们第一次声明对象和编译器时仅在析构函数 ()
中刷数据成员时被分配