2013-03-27 83 views
-3

在C++中,我正在使用char指針寫入一個內存區域。我的字符指針如下:在C/C++中保持內存區域不變的方法

unsigned char * writer; 
    *(writer++)=0xF1; //example of write 

現在我的問題是,一旦我寫的......我的計劃內的一些其他的寫能這樣寫data..due到這我得到不正確的結果,當我讀。因爲我只寫了一次..在C/C++中有一些方法,所以我可以保持這個內存區域爲常量(未觸摸)..這樣程序的其他部分就不會寫入它。

+2

我真的不明白它.. – 2013-03-27 14:15:45

+5

你需要消除野指針和超出邊界的數組訪問。諸如「Electric Fence」之類的工具可以幫助您找到指針錯誤。 – 2013-03-27 14:16:59

+0

我假設你實際上讓指針指向某個有效的東西,而不是將其保留爲未初始化的? – 2013-03-27 14:17:10

回答

1

你不會有足夠詳細的解釋給出一個確切的答案,但我還以爲只是周圍傳遞指針const就足以做你想要的:

const unsigned char *writer; 

也許換寫功能集成到一個類,並只允許const訪問內存:

class MemWriter 
{ 
private: 
    unsigned char *writer; 
public: 
    const unsigned char *getMemory() const 
    { 
     return writer; 
    } 
    // 
    // Other methods to perform the writing defined here 
    // 
}; 

事實上這並不會從鑄造指針非const並寫入到它停止代碼,但它至少說明你的我保證內存是隻讀的。

4

不可移植,沒有。

您可能可以使用OS提供的工具將整個內存頁面標記爲只讀。這可能或可能不適用於您,具體取決於您是否可以將相關字節隔離到專用內存頁面中。這也是一種大錘的做法。

如果你想這樣做是爲了解決一個bug,那麼更好的方法是找到並修復這個bug。例如,如果您懷疑存在內存損壞,則valgrind是非常有用的工具。

0

如果您試圖阻止您可以信任的例程,而不是將指向const的指針轉換爲指向非const的指針,但可能會無意中寫入緩衝區,並將其視爲常量(例如,因爲打印錯誤或者因爲編寫例程時的粗心大意),那麼只需將指針轉換爲指向const的指針並僅將其傳遞給其他例程。當例程試圖通過指向const的指針寫入時,編譯器通常會發出警告或錯誤。 (這裏有一些漏洞,例如strchr例程。)當你以後釋放內存時,你可能需要將原始指針記錄爲非const,否則你將不得不「強制」轉換指針-to-const回到指向非const的指針。

如果您試圖防止例程可能溢出緩衝區或其他明顯誤入歧途的錯誤,請檢查您的計算平臺是否提供mprotect調用。這將需要在頁面對齊的地址(您的平臺可能撥打電話號碼如valloc)以頁面大小單位分配內存。再次,當需要釋放內存時,您可能需要更改保護以允許再次寫入。

0

在C++中,沒有什麼能夠阻止你寫入程序可用的地址空間,只要你有它的地址--32位/ 64位整數。使用像const這樣的關鍵字來防止意外覆蓋,並讓讀者明確你的意圖。在下面的代碼中,讓我們看看我們如何玩弄地址號碼,假設一個32位機器。

int main() 
{ 
    int i = 998979789; 

    std::cout << i << std::endl; 

    int j = (int)(&i);// get the address number 

    char * m = (char*)j; // change to a char* 

    char old = m[0]; // store the char for later use 

    m [0] = 'A'; // write over the memory 

    std::cout << i << std::endl; 

    m[0] = old; // again write to bring it back 

    std::cout << i << std::endl; 

    return 0; 
}