2015-09-19 28 views

回答

3

在MEM ory水平,根本沒有保護。

這完全是爲了開發人員在代碼上工作,以幫助他們避免錯誤。

的位置例如:

#include <iostream> 
using namespace std; 

class Test 
{ 
public: 
    Test() : x(10) {} 
    int getTest() { return x; } 
private: 
    int x; 
}; 

class Change 
{ 
public: 
    int x; 
}; 

int main() { 
    Test test; // x is 10 
    void* vp = &test; 
    Change* modify = (Change*)vp; 
    modify->x = 15; 
    cout << test.getTest(); // prints 15 
    return 0; 
} 

看到它在行動:http://ideone.com/MdDgUB

3

private變量僅由編譯器生成private。它們不位於unreachableprotected內存區域中。

您可以通過瀏覽內存如果對象結構是衆所周知的(有風險的,絕對不推薦訪問它們,但它證明是絕對沒有保障

由於它(https://ideone.com/RRsOkr)證明:

#include <iostream> 
using namespace std; 

class A 
{ 
public: 
    A() 
    { 
     publicAttr = 4; 
     privateAttr = 3; 
    } 
    int publicAttr; 
private: 
    int privateAttr; 
}; 


int main() { 
    A a; 
    std::cout << "Public attribute value is:" << a.publicAttr << std::endl; 

    void* aVoid = (void*) &a; // works, but char* is recommended (see comment) 
    aVoid += sizeof(int); 
    int privateAttrValue = *((int*) aVoid); 
    std::cout << "Private attribute value is:" << privateAttrValue << std::endl; 

    return 0; 
} 

這個程序的輸出兩個屬性值,即使一個不應該容易!

4 
3 
+0

我只想補充一點,編譯器允許以任意順序放置私有和公共成員塊,所以'aVoid'之後的下一個點可能在類之外 – NathanOliver

+0

另外:用'void *'做算術不是標準允許的;爲此使用'char *'(另外,'int *'在這裏可能會更簡單)。見http://stackoverflow.com/a/3524270/1084944 – Hurkyl

+0

@Hurkyl:有趣的,不知道。謝謝。 – jpo38

1

訪問修飾符如私有,公共和保護並不提供內存保護,任何水平。

相關問題