2017-05-08 10 views
-1

以下のコードでは、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

答えて

1

コール()オブジェクトが破壊取得した後、今任意のオブジェクトの任意の参照を持たないオブジェクトBを、あなたはそのことを、それがクラッシュしますので、オブジェクトの「名前」データメンバにアクセスしようとしています。 「テストライン」を追加することで確認できます。< <通話後(b);メインの行()

とメンバ関数がクラスに関連付けられているし、我々は、オブジェクトと、コンパイラデストラクタで唯一のスワイプデータメンバを(宣言するときに、初めて割り当てられますので、なぜ他の1が動作している)

+0

これは、動作が仕様であることを示唆しているようですので、この動作に依存できますか。私は何も発見していないので、あなたはその証拠を持っていますか? – Gasare

+0

私たちが知っているように、関数はメモリ内で一度だけ初期化され、すべてのオブジェクトに対して動作します。そのため、デストラクタは機能をスワイプしません。 –

関連する問題