这个bug怎么解释:Run-Time Check Failure #2 - Stack around the variable 'a' was corrupte

dongxi8 2011-01-29 08:25:37

在vs2010 里有如下bug:

“集合.exe”: 已加载“C:\Users\helloworld\Documents\Visual Studio 2010\Projects\test_1\Debug\集合.exe”,已加载符号。
“集合.exe”: 已加载“C:\Windows\System32\ntdll.dll”,Cannot find or open the PDB file
“集合.exe”: 已加载“C:\Windows\System32\kernel32.dll”,Cannot find or open the PDB file
“集合.exe”: 已加载“C:\Windows\System32\KernelBase.dll”,Cannot find or open the PDB file
“集合.exe”: 已加载“C:\Windows\System32\msvcp100d.dll”,已加载符号。
“集合.exe”: 已加载“C:\Windows\System32\msvcr100d.dll”,已加载符号。
Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.

谁可以帮我测试一下????


下面是源代码:


#include <iostream>
#include<string>
using namespace std;
class IntSet
{
public:
IntSet(){};
IntSet(int *agr,int agr_n);
void Print();
IntSet Merge(IntSet x);
private:
int *a;
int n;

};
IntSet ::IntSet(int *agr,int agr_n)
{
this->a=agr;
this->n=agr_n;
}
void IntSet::Print()
{
int m=0;
for (;m<this->n;m++)
{
cout<<*(this->a+m)<<" ";
}
cout<<endl;
}

IntSet IntSet ::Merge(IntSet x)
{
static int i=this->n, j=0 ,k=0,h,t;
int *temp;
temp=this->a;

for (;j<x.n;j++)
{
for (t=0,h=0;h<i;h++)
{
if (*(x.a+j)==*(temp+h))
{
t=1;
break;
}

}
if (t==0)
{
*(temp+i+k)=*(x.a+j);
k++;
}

}
IntSet temp_IntSet(temp,i+k);
return temp_IntSet;
}

int main()
{
int a[ ]={1,2,3,5,8,10,67,55,9000};
int b[ ]={2,8,9,11,30,56,67,99,88,55};
IntSet set1(a,9),set2(b,10),set3;

cout<<"1:"<<endl;
set1.Print();
set2.Print();
set3.Print();

set3=set1.Merge(set2);

cout<<"2:"<<endl;
set1.Print();
set2.Print();
set3.Print();
return 0;
}



谁可以帮我测试一下?/

谢了
...全文
3398 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
管哥的天下 2011-02-01
  • 打赏
  • 举报
回复
楼主定义IntSet IntSet ::Merge(IntSet x)


当调用下面set3=set1.Merge(set2);会发生一个拷贝,楼主自己要实现!因为系统自定义

会把set3和set2中的成员变量指向同一个区域,当对象set2析构,set3也会析构!当再次析构set3时

会出现错误!
harleypang 2011-02-01
  • 打赏
  • 举报
回复
数组越界了,造成崩溃。而vc6并不检查数组越界。
harleypang 2011-02-01
  • 打赏
  • 举报
回复
Run-Time Check Failure #2
一般是栈被破坏,你的代码可能有缓冲区溢出一类的问题。

Run-Time Check Failure #2 - Stack around the variable 'var' was corrupted
摘要:
简介VC++.NET编译新功能,运行时错误检查,编译选项 (/RTC1, equiv. to /RTCsu)
最近把一个别人早期在VC 6下编写的一个服务移植到VC 7.1 (.NET 2003)时,突然跳出
好些运行时错误提示。
经过查询编译器和出错说明,发现了编译器的这一新特性,并修正了代码隐患:
//someheadefile.h
typedef struct tarSomeMessagePack
{
char moibleNumber[20];
....
}SomeMessagePack_T,*SomeMessagePack_Ptr;

细心的开发者可能已经发现,这里使用字符串数组下标越界了。即mobileNumber[]有效元素
下标为0到19,mobileNumber[20]是非法的。在VC 6下,编译运行并没有处任何问题,这也结
构体在内存字节对齐也有关系,实际上,mobileNumber[]在默认与8字节对齐的环境下编译链
接的,因此,后4个bit也不会被系统用到,即mobileNumber[20],mobileNumber[21],
mobileNumber[22],mobileNumber[23]系统把它空着。
尽管系统运行同几年都很正常,但
strncpy(pack.mobileNumber," ",20);
这样的代码也是危险的代码,要是有一天,把这个结构体字节对齐方式改为1,那么程序一定
在这里崩溃。
VC7.1为我们提供了一种机制,在编译选项中,增加(/RTC1, equiv. to /RTCsu)项选。当程序
运行到这里的时候,即会向我们报告这一错误。
查看相关文档,了解了这一块代码的真实意图后,我把代码改为
strncpy(pack.mobileNumber," ",19);
这一问题消失。

//someimplement.cpp
strncpy(pack.mobileNumber," ",20);

郑注:这就是一些变量的内存访问出错造成的,而且在错误对话框中明显的提出了是哪个变量访问出错,可以查这个变量得到结果。典型的错误:如定义了一个TCHAR Code[1];,结果在使用中使用到了Code[1],就产生了这个错误
发表于 @ 2009年03月20日 20:46:00 | 评论( 0 ) | 编辑| 举报| 收藏

新一篇:网络连通检测命令PING详解
查看最新精华文章 请访问博客首页相关文章发表评论表 情: 评论内容: 用 户 名:登录 注册 匿名评论 验 证 码: 重新获得验证码
热门招聘职位【方正国际】诚招软件精英 北京+苏州+武汉【热聘】搜狐畅游全国热招开发工程师【爱立信上海】急招多媒体、核心网开发测试工程师,国际团队等你加盟!【舒适刀片】诚聘IT Programmer (VB,VBS,VBA, web development编程)【Zynga Beijing】热招各类游戏人才,与我们共建属于你的虚拟帝国【开心网】高薪诚聘各类技术人才【MediaV】技术类职位热招,欢迎应届毕业生【瀚信科技】诚聘 WINDOWS C++ WINDOWS C#中高级开发工程师【美国国家仪器】诚聘高级软件 工程师 信号处理软件部门经理【网路时代】高薪诚聘C++、.net开发工程师【天际网】急聘Java应用架构师、高级Java工程师、网页设计师【达内集团】高薪诚聘JAVA讲师.嵌入式讲师.3G讲师.技术总监.分公司总经理【方正国际】诚招软件精英 北京+苏州+武汉【热聘】搜狐畅游全国热招开发工程师【爱立信上海】急招多媒体、核心网开发测试工程师,国际团队等你加盟!【舒适刀片】诚聘IT Programmer (VB,VBS,VBA, web development编程)【Zynga Beijing】热招各类游戏人才,与我们共建属于你的虚拟帝国【开心网】高薪诚聘各类技术人才【MediaV】技术类职位热招,欢迎应届毕业生【瀚信科技】诚聘 WINDOWS C++ WINDOWS C#中高级开发工程师【美国国家仪器】诚聘高级软件 工程师 信号处理软件部门经理【网路时代】高薪诚聘C++、.net开发工程师【天际网】急聘Java应用架构师、高级Java工程师、网页设计师【达内集团】高薪诚聘JAVA讲师.嵌入式讲师.3G讲师.技术总监.分公司总经理 公司简介|招贤纳士|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
江苏乐知网络技术有限公司 提供商务支持
Email:webmaster@csdn.net
Copyright © 1999-2010, CSDN.NET, All Rights Reserved


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/leishiwei/archive/2009/03/20/4009167.aspx
jikeyuan1 2011-02-01
  • 打赏
  • 举报
回复
浅拷贝问题 LZ 好好看看浅拷贝和深拷贝把 这是涉及内存中变量是否占用同一个内存空间可能造成内存泄漏!!不过LZ还是换个编译器的好 GCC吧 呵呵
pstrunner 2011-02-01
  • 打赏
  • 举报
回复
浅拷贝,造成对同一块内存区域两次析构。

[Quote=引用 7 楼 guandq2106 的回复:]
楼主定义IntSet IntSet ::Merge(IntSet x)


当调用下面set3=set1.Merge(set2);会发生一个拷贝,楼主自己要实现!因为系统自定义

会把set3和set2中的成员变量指向同一个区域,当对象set2析构,set3也会析构!当再次析构set3时

会出现错误!
[/Quote]
欣客 2011-01-29
  • 打赏
  • 举报
回复
楼上解释很清楚,越界了 。。。
zjw6861982 2011-01-29
  • 打赏
  • 举报
回复

IntSet IntSet ::Merge(IntSet x)
{
static int i=this->n, j=0 ,k=0,h,t;
int *temp;
temp=this->a;

for (;j<x.n;j++)
{
for (t=0,h=0;h<i;h++)
{
if (*(x.a+j)==*(temp+h))
{
t=1;
break;
}

}
if (t==0)
{
*(temp+i+k)=*(x.a+j);//不明所以的代码
k++;
}

}
IntSet temp_IntSet(temp,i+k);//temp是this->a,只有i个int的空间,而你竟然想给他i+k个值
return temp_IntSet;//返回临时对象,已经析构,
}




如果要实现你的合并的功能,
你要先申请空间
main里面定义c[20];
set3(c, 20);
重载符号 =
qq120848369 2011-01-29
  • 打赏
  • 举报
回复
merge不知道你用来干嘛,但是整个过程都是浅拷贝,没有析构函数,任何修改都会直接影响到main里的数组,自己好好看一下书。
qq120848369 2011-01-29
  • 打赏
  • 举报
回复
static int i=this->n, j=0 ,k=0,h,t;

只会初始化一次,之后就不会再读这一句了,上一次的值会留给下次。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧