将一块堆内存设为只读

时间:2011-09-16 08:51:51

标签: c++

如果我在C ++中有一个数据库应用程序。当数据量很小时,很容易调试bug。 但是当数据量变得庞大,并且关系变得复杂时,该错误很难调试,或者难以找到它的根本原因。有时,callstack无法告诉您足够的信息来查找根本原因,因为内存已经崩溃。一个组件的内存很容易被其他组件写入。只有当第一个组件访问该内存时,我们才遇到崩溃,但为时已晚。

找到根本原因的难度与处理数据的大小成正比。

我想知道是否存在任何预测风险的技巧,以及用于避免非法内存写入的保护代码。

C ++指针是一个强大的工具,但它也是使用它的高风险。任何代码都可以使用指针随时写入/更新内存。当一个代码写一个内存时,没有其他类对象知道它,除非该类访问该内存,然后发现该值已经无效,崩溃。

如果A持有指向B的指针,那么一些代码会写入该内存以使值为C. 然后当A使用B指针做某事时,指针无效。

我想知道,如果有某种方法可以避免这种情况,也许这是不可能的。我们可以在那里添加一些保护代码。

我认为可能的一种方法是我可以在更改之前使内存可写,更改之后使其可读。所以其他代码无法写入,否则崩溃。这有助于我更早地找到问题。

有没有办法让一堆堆内存为只读?

平台是windows。我希望我可以在代码中使用一些开关来控制它的访问权限。

1 个答案:

答案 0 :(得分:4)

我认为这里的一般伎俩是关注点的分离。如果您可以编写可以放心使用的小型,独立的代码片段,然后以有用的方式将这些构建块连接在一起,那么对结果充满信心就容易得多。

通过单元测试可以提高对各个构建块(类,函数等)的信心。对于您希望更改的代码,这会计为两倍:)

在没有看到任何代码的情况下,提供任何有针对性的建议有点困难,但我的猜测是您的组件之间具有高度耦合和低内聚性,并且您的数据封装/所有权可能也需要工作。谷歌有很多关于你如何deal with these kinds of issues的信息。