内存动态分配和释放的问题

aspirer2004 2009-06-22 10:11:21

#include <iostream>
//#include <string>
using namespace std;
#include<stdio.h>
#include<malloc.h>
#include<string.h>

class String
{
public:
String(const char *pStr);
String(const String &source);
~String(void);
String &operator = (const String &source);
void Disp()
{
cout << mPData << endl;
}
private:
char *mPData;
};

String::String(const char *pStr)
{
mPData = new char[strlen(pStr) + 1];
strncpy(mPData, pStr, strlen(pStr) + 1);
//Disp();
}

String::String(const String &source)
{
*this = source;
}

String &String::operator =(const String &source)
{

mPData = new char[strlen(source.mPData) + 1];
strncpy(mPData, source.mPData, strlen(source.mPData) + 1);
return *this;
}

String::~String()
{
delete mPData;
}
int main()
{
char *s = "afs";
String aStr(s);
aStr.Disp();

String bStr(aStr);
bStr.Disp();

for (int i = 0; i < 100000000; ++i)
{
bStr = aStr;
}//运行这段代码内存会被占满,怎么解决这个问题?


return 0;
}


问题的原因我知道,是因为每次复制的时候都会开辟一段新内存空间,而且没有被释放。
...全文
34 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
andylovecandy 2009-06-22
  • 打赏
  • 举报
回复
嗯,同意13楼的,应该要检查的
aspirer2004 2009-06-22
  • 打赏
  • 举报
回复
楼上的说的好,就差一点就是楼上的楼上说的,operator=没有检查自身=自身的情况。
gongyue1051 2009-06-22
  • 打赏
  • 举报
回复
同意5楼的说法,构造函数要重写一个,需要申请内存,而赋值则需要释放内存
andylovecandy 2009-06-22
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
#include<stdio.h>
#include<malloc.h>
#include<string.h>

class String
{
public:
String(const char *pStr);
String(const String &source);
~String(void);
String &operator = (const String &source);
void Disp()
{
cout << mPData << endl;
}
private:
char *mPData;
};

String::String(const char *pStr)
{
mPData = new char[strlen(pStr) + 1];
strncpy(mPData, pStr, strlen(pStr) + 1);
//Disp();
}

String::String(const String &source)
{
//delete mPData;

mPData = new char[strlen(source.mPData) + 1];
strncpy(mPData, source.mPData, strlen(source.mPData) + 1);
//return *this;
}

String &String::operator =(const String &source)
{
delete mPData;

mPData = new char[strlen(source.mPData) + 1];
strncpy(mPData, source.mPData, strlen(source.mPData) + 1);
return *this;
}

String::~String()
{
delete mPData;
}
int main()
{
char *s = "afs";
String aStr(s);
aStr.Disp();

String bStr(aStr);
bStr.Disp();

for (int i = 0; i < 100000000; ++i)
{
bStr = aStr;
}
return 0;
}


这样能运行了,改了一下Copy构造和operator=。
chao_83 2009-06-22
  • 打赏
  • 举报
回复
对,一般operator=都要检查 自己=自己 的情况。
weixians 2009-06-22
  • 打赏
  • 举报
回复
补充一点,operator =应该要检查自赋值
chao_83 2009-06-22
  • 打赏
  • 举报
回复
我这浏览器看不到编辑格式的东西啊,忘了贴代码要加什么了。
chao_83 2009-06-22
  • 打赏
  • 举报
回复
[Code=C/C++]
是的。
if (p) {
delete [] p; // array
p = 0;
}
[Code]
andylovecandy 2009-06-22
  • 打赏
  • 举报
回复
赋值之前,把目标对象已经分配的动态内存释放……
steven_007 2009-06-22
  • 打赏
  • 举报
回复
学习。
aspirer2004 2009-06-22
  • 打赏
  • 举报
回复
是啊,多练习,才理解的更深刻。
怎么个自检法?判断指针是否为空?
chao_83 2009-06-22
  • 打赏
  • 举报
回复
上面 为初始化 -> 未初始化
chao_83 2009-06-22
  • 打赏
  • 举报
回复
operator =(const String &source) 有问题。
先自检,把原来的内存释放,然后再new新的。

拷贝构造也有问题,在执行 *this = source; 之前,
mPData是为初始化的!!

你怎么不用标准库呢,要练习?
aspirer2004 2009-06-22
  • 打赏
  • 举报
回复
这样还是不能避免那个问题啊~
biosli 2009-06-22
  • 打赏
  • 举报
回复
有意思。
试试这个:

//...
int main()
{
char *s = "afs";
String aStr(s);
aStr.Disp();

for (int i = 0; i < 100000000; ++i)
{
String bStr(aStr);
bStr.Disp();
}

return 0;
}
aspirer2004 2009-06-22
  • 打赏
  • 举报
回复
只修改成员函数的内容。
aspirer2004 2009-06-22
  • 打赏
  • 举报
回复
不要修改String类和其中的成员~

64,648

社区成员

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

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