我的主要功能在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/