为什么会内存溢出

楚江课的救赎 2013-03-31 11:28:42
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
class String
{
private:
char* str;
int lne;
static int num;
public:
String( char* c );
~String(){cout<<"clear!\n";delete []str;}
friend ostream& operator<<(ostream& os,String &T);
};
String::String( char * c)
{
lne=strlen(c);
str=new char[lne+1];
strcpy(str,c);
}
ostream& operator<<(ostream& os,String& T)
{
os<<T.str<<"\t"<<endl;
return os;
}
void dispaly(String dl)
{
cout<<dl;
}
int main()
{
String l("hello,linux");

String H("hahahahahahahaahahah");
dispaly(l);
dispaly(H);
return 0;
}
...全文
130 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
enic 2013-04-01
  • 打赏
  • 举报
回复
囧,没怎么看明白这是说什么
wahaha_1986 2013-04-01
  • 打赏
  • 举报
回复
至于浅拷贝和深拷贝的详细区别,LZ可以在BAIDU上找找资料。
wahaha_1986 2013-04-01
  • 打赏
  • 举报
回复
浅拷贝与深拷贝的问题,简单低说就是void String::dispaly(String dl)需要调用类的拷贝构造函数,但是你的String并没有显示定义该函数,所以编译器会给你自动生成一个拷贝构造函数,注意这里就出现问题了,编译器自动定义的拷贝构造函数实现的是浅拷贝,浅拷贝的大意是如果类中含有指针成员变量,那么浅拷贝只拷贝指针本身(动态内存空间地址),这样就使得一个地址有两个变量表示。 1.当void String::dispaly(String dl)函数退出时,析构副本对象,本来是释放副本的堆空间,但是副本和原本指向同一个地址堆空间,所以就相当于释放了原本堆空间。 2.当主函数退出时,析构原对象,由于原对象所指推空间已经被释放,这里再析构就存在同一个堆空间被释放2次,所以就错了。 3.假设你的代码中没有指针成员变量,你的上述代码是没有任何问题的。 建议:对于存在指针变量的类,尤其是指针所指空间在堆上,如果你需要使用类的拷贝构造函数,就必须显示定义它以实现深拷贝。 在你代码中添加一个函数: String(String& c) { int len = strlen(c.str); this->str = new char[len+1]; memcpy(this->str,c.str,len); }
yubao669016 2013-04-01
  • 打赏
  • 举报
回复
dispaly(l); dispaly(H);这两个函数传参数的时候要调用拷贝构造函数,结束时候函数退栈要调用析构函数,当主函数退出时因为你刚开始已经构造了两个String的实例,所以退出时还要调用析构,所以就重复析构了 还有个小建议当你申请的数组大小比参数传进来的数大1时,最好要把最后一个元素设为‘\0’希望对你能有帮助
yubao669016 2013-04-01
  • 打赏
  • 举报
回复
我也是菜鸟,希望我的信息能对你有所帮助, 我看了你的代码当dispaly(l)传参数的时候会调用拷贝构造函数,当dispaly(l)结束的时候,因为函数要退栈所以要调用析构函数,dispaly(H)也是一样的道理,因为你友元函数里使用的String类的引用所以当Dispaly()函数结束时已经调用了析构函数,当主函数推出时候又要调用析构函数,所以重复调用析构函数了。
花墟弄影 2013-03-31
  • 打赏
  • 举报
回复
 
void dispaly(String& dl)<====
 {
	cout<<dl;
 }
花墟弄影 2013-03-31
  • 打赏
  • 举报
回复
 
void dispaly(String& dl)
 {
	cout<<dl;
 }
必须引用或者指针,你的CODE压根就没将对象释放

64,642

社区成员

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

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