在C++中,我正在使用char指針寫入一個內存區域。我的字符指針如下:在C/C++中保持內存區域不變的方法
unsigned char * writer;
*(writer++)=0xF1; //example of write
現在我的問題是,一旦我寫的......我的計劃內的一些其他的寫能這樣寫data..due到這我得到不正確的結果,當我讀。因爲我只寫了一次..在C/C++中有一些方法,所以我可以保持這個內存區域爲常量(未觸摸)..這樣程序的其他部分就不會寫入它。
在C++中,我正在使用char指針寫入一個內存區域。我的字符指針如下:在C/C++中保持內存區域不變的方法
unsigned char * writer;
*(writer++)=0xF1; //example of write
現在我的問題是,一旦我寫的......我的計劃內的一些其他的寫能這樣寫data..due到這我得到不正確的結果,當我讀。因爲我只寫了一次..在C/C++中有一些方法,所以我可以保持這個內存區域爲常量(未觸摸)..這樣程序的其他部分就不會寫入它。
你不會有足夠詳細的解釋給出一個確切的答案,但我還以爲只是周圍傳遞指針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
並寫入到它停止代碼,但它至少說明你的我保證內存是隻讀的。
不可移植,沒有。
您可能可以使用OS提供的工具將整個內存頁面標記爲只讀。這可能或可能不適用於您,具體取決於您是否可以將相關字節隔離到專用內存頁面中。這也是一種大錘的做法。
如果你想這樣做是爲了解決一個bug,那麼更好的方法是找到並修復這個bug。例如,如果您懷疑存在內存損壞,則valgrind
是非常有用的工具。
如果您試圖阻止您可以信任的例程,而不是將指向const的指針轉換爲指向非const的指針,但可能會無意中寫入緩衝區,並將其視爲常量(例如,因爲打印錯誤或者因爲編寫例程時的粗心大意),那麼只需將指針轉換爲指向const的指針並僅將其傳遞給其他例程。當例程試圖通過指向const的指針寫入時,編譯器通常會發出警告或錯誤。 (這裏有一些漏洞,例如strchr
例程。)當你以後釋放內存時,你可能需要將原始指針記錄爲非const,否則你將不得不「強制」轉換指針-to-const回到指向非const的指針。
如果您試圖防止例程可能溢出緩衝區或其他明顯誤入歧途的錯誤,請檢查您的計算平臺是否提供mprotect
調用。這將需要在頁面對齊的地址(您的平臺可能撥打電話號碼如valloc
)以頁面大小單位分配內存。再次,當需要釋放內存時,您可能需要更改保護以允許再次寫入。
在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;
}
我真的不明白它.. – 2013-03-27 14:15:45
你需要消除野指針和超出邊界的數組訪問。諸如「Electric Fence」之類的工具可以幫助您找到指針錯誤。 – 2013-03-27 14:16:59
我假設你實際上讓指針指向某個有效的東西,而不是將其保留爲未初始化的? – 2013-03-27 14:17:10