以下のコードでは、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;
}
は未定義の動作の土地へようこそ。唯一のルールはルールがないことです。 – NathanOliver
'new'演算子についてこれまで聞いたことがあります – Sniper
短い答え - ' printAlternativ'はクラスのメンバーにアクセスしないので、インスタンスは_technically_必要ではありません。しかし、それは動作することが保証されていません。 – icabod