实例化对象内存分配问题?

yjj0471 2011-05-01 09:33:37
初学C++ 基于VC++ 6.0开发。有两个问题请教没弄清楚:

一、自己写了一个类,实现200位大整数的加、减、乘、除等。类名为MyIntClass,然后在主函数中实例化该类为一个对象,进行运算(主函数中多次用到了 new 和 delete 操作)。当计算量较小时,会出现正确的结果,如计算50位、60位的整数都没问题。当计算超过100位的整数时,程序就会报错,然后退出。

但是当我在类中定义一个 long A[1000000]这样大数组后(不用初始化),计算超过100位的整数时,程序也很正常。我猜测是在实例化对象时给分配了足够的内存空间可供使用,因此不会出错。但是详细的实现原理不清楚,是不是如果不定义大数组,系统默认分配给对象的空间不够?定义了大数组之后,分配给大数组的空间被用来支撑其他函数的运算?还是系统对堆空间分配的内存空间增大了?
拜托高手给指点一下,谢谢!
class MyIntClass
{
public:
long A[100000]; // 大数组

/*
定义的其他变量和函数
*/

};

...全文
277 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjj0471 2011-05-03
  • 打赏
  • 举报
回复
debug模式下没有问题,release模式下,在win 7系统中提示“内存不足”,XP系统中提示“内存不能read”,
baidu了一下,有的说变量没有初始化,有的说局部变量太大也有可能,晕了!
辰岡墨竹 2011-05-03
  • 打赏
  • 举报
回复
嗯,类里定义的数组,在对象实例化时是和对象其它部分(除了类函数以外)一样从堆里分配的。
不过我觉得你肯定是有指针用错或范围溢出的非法操作,用大数组把它隔离了,如果你不定义这个大数组,那么你的非法操作就直接到外面去了,发生了非法的内存读写。这个大数组相当于一个保护性的缓冲。
你用VC调试一下,看看到哪里出错了,把那部分代码贴出来看看。
yjj0471 2011-05-03
  • 打赏
  • 举报
回复
多谢Bokutake了
yjj0471 2011-05-03
  • 打赏
  • 举报
回复
Bokutake 说的靠谱,我根据你的提示再试试看。

总算有人明白我说什么了!!!!!
ljt3969636 2011-05-02
  • 打赏
  • 举报
回复
是我晚上眼神不好思路慢怎么的,你这上下两端代码

class MyIntClass
{
public:

long A[100000];
/*
定义的其他变量和函数
*/

};




class MyIntClass
{
public:

//long A[100000]; // 大数组

/*
定义的其他变量和函数
*/

};


有什么区别吗
yjj0471 2011-05-02
  • 打赏
  • 举报
回复
代码实在是太多了,没法都贴上来。


class MyIntClass
{
public:

long A[100000];
/*
定义的其他变量和函数
*/

};
void main()
{

MyIntClass* newClass;
newClass = new MyIntClass;
/*
使用 newClass进行计算; 没问题。
*/
}

//=============================================
// 下面这样就出现问题了
class MyIntClass
{
public:

//long A[100000]; // 大数组

/*
定义的其他变量和函数
*/

};
void main()
{

MyIntClass* newClass;
newClass = new MyIntClass;
/*
使用 newClass进行计算; 程序运行出错。
*/
}

不知道说清楚了没有
  • 打赏
  • 举报
回复
我觉得你有什么问题最好把代码贴出来,大家才能更好的理解你所要表达的意思,不然空凭文字,真是
有点头晕,不晓得到底你要干嘛!

ljt3969636 2011-05-02
  • 打赏
  • 举报
回复
说实话没听懂你在表述什么,你的代码什么情况下有问题,什么情况下没问题?
yjj0471 2011-05-02
  • 打赏
  • 举报
回复
怎么没人帮忙啊?
yjj0471 2011-05-01
  • 打赏
  • 举报
回复
补充一点,我实例化类采取的是这样的方式:

MyIntClass* newClass;
newClass = new MyIntClass;
yjj0471 2011-05-01
  • 打赏
  • 举报
回复
可能是我没有表达清楚, 事情是这样的,

我在用了long A[100000]之后,我的程序可以正常运行,达到目的了。

如果把大数组注释掉,即: // long A[100000]; 我的程序就出问题,我现在想知道这是怎么回事儿?
书虫 2011-05-01
  • 打赏
  • 举报
回复
long A[100000]; // 大数组
这个是使用的栈空间,而不是堆,在对象初始化时,在栈空间上分配的!所以很可能会溢出!
所以最好是在堆上分配空间,可以参考:
A = new long [100000];
而且大数运算一般情况下采用char数组,不知你为何用long的,因为char是一个字节,long是4个!
keke13 2011-05-01
  • 打赏
  • 举报
回复
long A[100000];
这么大容易溢出吧
無_1024 2011-05-01
  • 打赏
  • 举报
回复
用链表吧

64,637

社区成员

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

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