比如:
int *pA = new int;
*pA = 10; //此时捕获事件?有方法吗?

解决方案 »

  1.   

    或许做一个对象
    在类里面加一个消息
    重载=的时候SendMessage
      

  2.   

    学习。我一般在做某个东西的设置对话框时,都是先把这个东西整个duplicate一个,然后在对话框中随意操作这个东西,如果点了确定,则相当于commit,整个再Copy回去。
    点了cancel,则相当于rollback,啥也不执行,反正不是在真的操作原始数据。不知对搂住有帮助么。glgl
      

  3.   

    好象有方法的,看看<windows核心编程>
      

  4.   

    To superS(super慢):
    这种方式可行,但会super慢,如果这段代码被频繁执行。这样应该是最好的,我记录下来我做了哪些事,等我回滚的时候我在将其复原。但是监控的方法应该是怎么样的呢?
      

  5.   

    其实可以程序开始时分配一些内存作cache,因为赋值操作还是比较快的。只有cache满了才分配内存。
    另外在构造数据结构时尽量构造成能用memcpy来赋值的结构。这样赋值的速度也能提高了,甚至考虑内存对齐什么的进一步提高。比起跟踪写操作什么的,我觉得这应该是比较合理的办法。
      

  6.   

    e.g.我有一批内存(我由new来分配的,我记录了他们的大小起始地址),现在我要模拟一个事务的过程,我只对其中的3个值进行操作,如果不成功我要回滚,将内存恢复到原来的值。如果用memcpy,假设这一批内存占据了20M的空间并且频繁操作,首先要备份,然后再判断失败的话恢复,这样可行,但肯定会很慢,速度上不允许。理想的方法就是我只备份我修改的那3个值,失败了也只要恢复3个值就可以了,前提是要把设置一个系统的事件对指定的内存地址进行监控,在修改之前做备份。这种方法是最好的,但我不知道怎么实现?
      

  7.   

    这个可就复杂了,如果你能象 SoftICE 一样具有调试能力就行
    不过可不是那么容易的事情
      

  8.   

    如果想要通过事件来处理那就别想了
    对于内存地址的话是肯定行不通的了,我只见 SoftICE 这样的软件能够处理
    如果是通过 API 函数访存的话也许能够通过全局钩子处理
    如果单单是象 *a = 5; 这样编译成 MOV 语句的就不可能了,连 SoftICE 也做不到,除非通过单步调试,这样你的程序就不知道运行到猴年马月了
    对于 IO 地址的话不是太清楚,不过好象过滤层驱动也不能拦截 IO 访问
      

  9.   

    另外,如果这个东西有上千万的收益的话倒也不是完全不可行,给你一个方案:
    把通过 CPU 数据引脚出来的数据全部通过自设计的硬件中转记录
    用这种方法你想破USB狗都可以,不过离猴年马月也不远了,呵呵
    开个玩笑而已
      

  10.   

    "现在我要模拟一个事务的过程,我只对其中的3个值进行操作,如果不成功我要回滚"......不明白
    ----------- 一切都是你操作的,那你怕什么.只要在操作前记录一下进行了什么操作就行了呗!
    struct Operation
    {
        int * pAddress;
        int iOldVal;
    }
    std::list<Operation> m_listOp;
      

  11.   

    谢谢大家的关注!现在我把我的情况跟大家说一下,看看大家有什么办法没?我们的系统原来使用的是国外的ObjectStore,这是一个面向对象的数据库系统,这个数据库做得非常好,但就是版税太贵了,我们现在就模拟了我们的系统用到的ObjectStore的所有接口,实现了一个面向对象的数据库存储系统,把原来的ObjectStore替代了,现在正常操作都没有问题,但就是事务没有很好的解决。数据库系统中重载了new操作符,所有的数据相关的对象分配都会被分配在预定大小的内存块中,在事务传输过程中如果发生了意外,系统会调用abort回滚内存记忆而保证程序的正常运行进行的容错处理。我们也实现了这些,我们现在实现的方法是事务开始前将整个记忆体全部备份了一份,abort后返回。这样做效率特别低,这就是我在前面提出的问题,有没有方法我只恢复我修改了的数据?这样大家明白了吗?:)
      

  12.   

    你说的那个数据库我每听说过(见笑),不过对数据库回滚我可以给你的思路。我在用oralce
    我觉得他的实现原理说这样的:先将要处理的记录读到缓存中做一拷贝,然后对拷贝做修改。
    如果程序没报错,则用拷贝更新实际地址中的值。这不就实现了你说得功能了吗。
    因此,不要直接将指针指向实际值,才是解决问题的关键。