我有一個關於爲什麼我可以訪問某些內存塊的問題,我認爲它與我理解(或不理解)編譯器如何將內存保存在內存中的方式有關。這是示例代碼我的工作:C++清除的內存仍可訪問
頭文件:
#include <iostream>
using namespace std;
class A
{
public:
int value;
A (int newValue = 5)
{
value = newValue;
cout << "A()" << endl;
}
~A() { cout <<"~A()" << endl; }
void func1() {cout << "A::func1()" << endl; }
};
class B : public A
{
public:
B() { A::value = 0; cout << "B()" << endl; }
~B() { cout << "~B()" << endl; }
virtual void func1() { cout << "B::func1()" << endl; }
};
class C : public B
{
public:
C() { cout << "C()" << endl; }
~C() { cout << "~C()" << endl; }
virtual void func1() { cout << "C::func1()" << endl; }
};
.cpp文件:
int main()
{
int i;
cout << endl;
A* pA = new A (5);
B* pB = new B;
C* pC = new C;
pA->func1();
pB->func1();
pC->func1();
delete pA;
delete pB;
delete pC;
cout << endl;
//here is my first question - why don't I get a compiler error here?
//why does the compiler know what this is? Didn't I delete it?
A* ppA = pC;
//here is my second question - why does this work?
//didn't I clear this memory?
ppA->func1();
B bObject;
B* ppB = &bObject;
ppB->func1();
cin >> i;
return 0;
}
我的問題是正確的,在評論 - 爲什麼我沒有得到這些線路上的錯誤?
如果我更改.h文件,使func1()
爲virtual
也在A
中,我確實在該行上發生訪問衝突,但仍然沒有編譯時錯誤。
感謝您的任何解釋:)
我相信這可能是因爲你用delete刪除了內存,但它可能沒有寫完。因此數據可能仍然存在。但是不確定。 –
僅供參考_compiler_不會將內容保存在內存中。該任務由操作系統執行。 – ALOToverflow
@Francis,啊,那些善良的迂腐人物,他們只是對他們迂腐的東西有一個模糊的概念。你知道G ++在編譯一個文件的內存中「保存」了更多的東西,而不是所有的程序放在一起嗎?只是「供參考」。 – Blindy