LINGSUIYU'S BLOG

C++博客 联系 聚合 管理
  2 Posts :: 0 Stories :: 10 Comments :: 0 Trackbacks

2008年8月21日 #

        昨天在调程序时,发现了一个问题,在Debug模式下出现Debug Error!DAMAGE:after Normal block (#xxxx)错误,Release没问题。网上一搜,知道这是由越界访问内存,破坏了内存中其他数据而引起问题。但大部分帖子介绍这个问题都是由动态申请内存和动态释放引起。而我的程序中根本没有用过new和delete;也有一个帖子说数组越界也会发生这种情况,我又查了很多遍,数组都正常。只好继续调代码,最后被我跟到一个调用的DLL(DLL也是自己写的)里面,并且锁定在一行代码上:

ModelName = strcat(ModelName,".txt");    // ModelName的类型是char *

        这里ModelName是从调用DLL的类的实例中传过来的一个字符串指针,在DLL中由于上面的语句,导致调用处的字符指针越界,从而产生了这个错误。因为Release没有内存越界提示,所以没有发现这个问题,但这样的内存隐患足以致命。可见操作指针内存小心为上,故慎重的把它记录下来。
posted @ 2008-08-21 11:10 零碎雨 阅读(5382) | 评论 (7)编辑 收藏

        在Efficient C++的第二章,讲述了关于继承和构造(析构)函数造成的计算开销,仍然有些糊涂。对与以下三段关于互斥锁使用的代码(来自Efficient c++):

// Version 1
int main()
{
    
    
// Start timing here
    for(i=0; i<1000000; i++)
    
{
        pthread_mutex_lock(
&mutex);
        shareCounter
++;
        pthread_mutex_unlock(
&mutex);
    }

    
// Stop timing here
    
}

 

// Version 2
int main()
{
    
    
// Start timing here
    for(i=0; i<1000000; i++)
    
{
        SimpleMutex m(mutex);
        sharedCounter
++;
    }

    
// Stop timing here
    
}


class SimpleMutex
{
public:
    SimpleMutex(pthread_mutex_t 
& lock):myLock(lock){acquire();}
    
~SimpleMutex{release();}

private:
    
int acquire(){return pthread_mutex_lock(&myLock);}
    
int release(){return pthread_mutex_unlock(&myLock);}
    pthread_mutex_t 
& myLock;
}
;

// Version 3
int main()
{
    
    
// Start timing here
    for(i=0; i<1000000; i++)
    
{
        DerivedMutex m(mutex);
        sharedCounter
++;
    }

    
// Stop timing here
    
}


class BaseMutex
{
public:
    BaseMutex(pthread_mutex_t 
& lock){};
    Virtual 
~BaseMutex(){};
}
;

class DerivedMutex:public BaseMutex
{
public:
    DerivedMutex(pthread_mutex_t 
&lock):BaseMutex(lock),myLock(lock){acquire();}
    
~DerivedMutex(){release();}

private:
    
int acquire(){return pthread_mutex_lock(&myLock);}
    
int release(){return pthread_mutex_unlock(&myLock);}
    pthread_mutex_t 
& myLock;
}
;

书中测得的结果是Version 1和 Version 2 耗时相同,为1.01s,而Version 3 耗时1.63秒,这说明前两个版本计算开销相同而第三个版本计算开销明显增加。
        而书中也说了Version 2 的构造函数中,初始化myLock成员是计算损失,当acquire()内联不成功的时候,调用acquire()也是计算损失。
        再看Version 3,它首先调用基类的构造函数,由于是内联的,而且函数体为空,其开销应该忽略不计,然后是初始化myLock,调用acquire(),这些都跟Version 2中一样。
        这样看起来反倒是Version 2 和  Version 3 的计算花费应该相同了,而Version 1的计算花费要比它们少。而书上好像没有对这个问题作出解释。我不知道是什么地方理解错误了,所以先悬着,等找到答案再把它写完。或者如有看到此文而不吝赐教的,不胜感激!
posted @ 2008-08-21 10:09 零碎雨 阅读(270) | 评论 (3)编辑 收藏

仅列出标题