我遇到的问题顺与你一起探讨,说得对者都有分,我正愁有1万多分给不出去。

时空隧道 2002-03-22 01:23:53
以下代码在func运行期间会发生什么事情。
class A
{
public:
char* pcBuff;
A(){pcBuff=new char[100];}
~A(){delete pcBuff;}
};
void func()
{ int i;
for(i=0;i<=8;i++)
func1(clsA);
}
func1(A clsA)
{
int i=0;

}
...全文
70 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
newhandaking 2002-03-22
  • 打赏
  • 举报
回复
都是高手呀,我这个GREEN HAND 没什么好说的,只不过EFFECTIVE C++ 上有一条说拥有指针的类一定得自定义一个拷贝构造函数和一个operator = ,对不对?
时空隧道 2002-03-22
  • 打赏
  • 举报
回复
很高兴有这么多人进来而且都说得有道理,本来我才疏学浅,让我又学到了不少一会儿我收贴了。thank you!!!
lei30303 2002-03-22
  • 打赏
  • 举报
回复
喂,朋友,你该不会是编错了,来玩大家吧,要不得三
ccom 2002-03-22
  • 打赏
  • 举报
回复
没有自己的复制构造函数,另外你的delete 应为delete[]
LegerWu 2002-03-22
  • 打赏
  • 举报
回复
程序缺乏拷贝构造函数,当第二次循环后,因为系统没有调用构造函数,却调用了析构函数,所以会出现down机,程序正确写法为:

class A
{
public:
char* pcBuff;
A(){pcBuff=new char[100];}

A(const A& a){pcBuff=new char[100];} //增加拷贝构造函数

~A(){delete pcBuff;}
};

void func()
{ int i;
for(i=0;i<=8;i++)
func1(clsA);
}

void func1(A clsA)
{
int i=0;
}

注意:当定义某类的对象时,同时以该类的对象为该对象的初值时,拷贝构造函数将会被调用.
Holly 2002-03-22
  • 打赏
  • 举报
回复
需要增加类似这样的构造函数,问题就没有了
A(A& a)
{
pcBuff = new char[100];
memcpy(pcBuff, a.pcBuff, 100);
}
guohong365 2002-03-22
  • 打赏
  • 举报
回复
运行异常终止!
func1(A clsA)
{
int i=0;

}
参数使用传值调用时,编译器将类复制一份放入堆栈,
如果无拷贝函数将调用默认拷贝函数。A(&A);
这时成员变量是一一对应复制的,因此堆栈中的
对象pcBuff未分配空间,析构时产生异常。

解决方法:
一、
func1(A &clsA)
{
int i=0;

}
二、
func1(A *clsA)
{
int i=0;

}
三、
class A
{
public:
....
A(A &a)
{
pcBuff=new char[100];
memcpy(pcBuff, a.pcBuff, 100);
}
....
}
kaitty 2002-03-22
  • 打赏
  • 举报
回复
发生什么事情有调用func1(clsA);时拷贝构造操作,
退出时的析构。虽然
for(i=0;i<=8;i++)
func1(clsA)发生了9次这样的操作。但析构时
只delete了一个字节的内存。泄漏了99字节内存。
zjp009 2002-03-22
  • 打赏
  • 举报
回复
没有什么大问题,写法不和语法规范而已,编译通不过。
stavck 2002-03-22
  • 打赏
  • 举报
回复
定义一个拷贝构造函数就可了,或func1该成引用
时空隧道 2002-03-22
  • 打赏
  • 举报
回复
Stavck(o_O)一针见血,请再提出解决方案完之后我可以收贴子发分了。
Lightest 2002-03-22
  • 打赏
  • 举报
回复
在调用func1(A clsA)时传递的是一个类,而非一个类的指针,也就是说,将重新构造一个A的实例(重新调用一次构造函数),然后拷贝claA中的成员到新的类实例中,这样新分配的内存指针被覆盖,造成泄漏,同时在析构时同一个内存指针会被delete两次,因而产生异常
stavck 2002-03-22
  • 打赏
  • 举报
回复
cslA在调用func1后被析构所以第二次调用时因无法析构而终止
kaitty 2002-03-22
  • 打赏
  • 举报
回复
我认为上面的代码没有任何问题,只不过浪费
了一些内存。
时空隧道 2002-03-22
  • 打赏
  • 举报
回复
上面代码我只是简单列出类及都在使用的前面作好声明,
stavck 2002-03-22
  • 打赏
  • 举报
回复
1,fun1应在使用前声明
2,func1没有返回类型
3类定义有点问题
时空隧道 2002-03-22
  • 打赏
  • 举报
回复
我提示一下跟类A的析构函数有关。
twist 2002-03-22
  • 打赏
  • 举报
回复
同意大家,都是高手,我来蹭点分。
应该提供一个拷贝构造函数吧。否则就传一个引用。
时空隧道 2002-03-22
  • 打赏
  • 举报
回复
我想听听JAVA_CJH(CJH)
为什么会出现异常终止??
wkoji 2002-03-22
  • 打赏
  • 举报
回复
void func()
{ int i;
for(i=0;i<=8;i++)
func1(clsA);//这里错误
}
异常跳出
加载更多回复(4)

16,470

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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