2013-03-27 86 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; 
}