由valgrind检测到的堆栈粉碎

时间:2014-10-24 06:32:32

标签: c++ memory-leaks valgrind main stack-dump

在我的main函数中用c ++代码检测到堆栈粉碎... 这是主体:

int main()
{
    long int acn;
    char dot[15];
    float open_balance=1;
    char k;
    int total_account=0;
    int c;
    static int ac=10000;
    TRANSACTION trn;
    support sprt;
    do{

        cout<<"\n1.New account\n2. Transaction\n3. Exit\n\nEnter choice:"; 
        cin>>k;
        switch(k) { 
            case '1':

                ac+=1;
                time_t rawtime;
                time(&rawtime);
                strcpy(dot,ctime(&rawtime));
                do{
                    if(open_balance<=0)
                        cout<<"Opening BALANCE can not be less than zero";
                    cout<<"\nEnter the opening balance :";
                    cin>>open_balance;
                }while(open_balance<=0);
                bln[total_account].get_data(ac,open_balance,dot);
                ++total_account;
                break;
            case '2':
                trn.trans(total_account);
                break;
            case '3': break;
            default :
                      cout<<"\nWrong choice!!";
        }
    }while(k!='3');
    cout<<"Thank you";
    return(0);
}

当我通过valgrind运行代码时,它也发现堆栈粉碎但找不到任何内存泄漏。 valgrind报告:

  

1.新帐号   2.交易   3.退出

     

输入选项:3    *堆栈粉碎检测* :./ a.out终止谢谢== 9813 ==

     

== 9813 == HEAP SUMMARY:

     

== 9813 ==在退出时使用:0块中的0字节

     

== 9813 ==总堆使用量:10个分配,10个释放,954个字节分配

     

== 9813 ==

     

== 9813 ==所有堆块都被释放 - 没有泄漏可能

     

== 9813 ==

     

== 9813 ==对于检测到的和抑制的错误计数,请重新运行:-v

     

== 9813 ==错误摘要:0个上下文中的0个错误(抑制:0从0开始)中止(核心转储)

我哪里错了?

1 个答案:

答案 0 :(得分:1)

这是导致堆栈混乱的行strcpy(dot,ctime(&rawtime));
function ctime返回一个字符串"Wed Jun 30 21:49:08 1993\n",其长度超过15个字节,你需要更多的字节存储ctime的结果。
strcpy不检查目标记忆的边距,因此被认为是危险的,建议使用替代strncpy。而且,如果您的程序运行多个线程,则首选ctime_r