我的主要功能在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 ==堆摘要:
  
  == 9813 ==在出口处使用:0字节,0块
  
  == 9813 ==总堆使用量:10个分配,10个释放,954个字节分配
  
  == 9813 ==
  
  == 9813 ==释放了所有堆块-不可能泄漏
  
  == 9813 ==
  
  == 9813 ==有关检测到的和抑制的错误的计数,请重新运行:-v
  
  == 9813 ==错误摘要:0个上下文中的0个错误(禁止:0个以下的0个)中止(核心已转储)


我要去哪里错了?

最佳答案

这是导致堆栈弄脏的行strcpy(dot,ctime(&rawtime));。函数ctime返回类似于"Wed Jun 30 21:49:08 1993\n"的字符串,其长度超过15个字节,并且需要更多字节来存储ctime的结果。不检查目标内存的余量,因此认为这很危险,建议使用替代strcpy。并且,如果您的程序运行多个线程,则首选strncpy

关于c++ - valgrind检测到堆栈崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26542631/

10-13 07:25