在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