vc中关于内存泄露的问题 new/delete

JJustRight 2009-01-21 02:29:57
请问各位,是不是用new申请的空间必须都要用delete释放
对于类,是不是应该在析构函数中释放
若在类中我用new申请的空间以地址形式返回,又怎么办呢(代码如下)
class T
{
//-----
double* vert();
};

double* T::vert()
{
double *v=new double[3];
v[0]=x;v[1]=z;v[2]=y;
return v;
}
...全文
275 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
normallife 2009-01-24
  • 打赏
  • 举报
回复
该用还是要用。
Allen_zhang 2009-01-22
  • 打赏
  • 举报
回复
改成下面这样就行了


class T
{

//-----
double* vert();

private:
double* m_v; // 定义的类变量
};

T::T()
{
m_v = NULL;
}

T::~T()
{
if ( m_v != NULL )
{
delete[] m_v;
m_v = NULL;
}
}

double* T::vert()
{
if ( m_v == NULL )
m_v = new double[3];

m_v[0]=x;
m_v[1]=z;
m_v[2]=y;
return m_v;
}


luojc714 2009-01-22
  • 打赏
  • 举报
回复
这样用:

T t;
double * p = t.vert();
...//使用它吧
delete []p; //用完了记得释放就可以了
kkndciapp 2009-01-22
  • 打赏
  • 举报
回复
是不是用new申请的空间必须都要用delete释放
是的 而且要配对
对于类,是不是应该在析构函数中释放
这个不一定,但是必须满足上面的一条
若在类中我用new申请的空间以地址形式返回,又怎么办呢(代码如下)
用delete删除返回的地址对于的堆内存
delphi_911 2009-01-22
  • 打赏
  • 举报
回复
必须delete,指针带来来了好处,但是要小心使用啊。
思远作细 2009-01-22
  • 打赏
  • 举报
回复
建议可以不用NEW的就不要NEW,用NEW并不见得技术高明。在实际的项目中,有经验的编写规范代码的前辈,都跟我要求尽量避免使用NEW和MALLOC,因为这两个东西常常忘记DELET获取FREE,另外,NEW和MALLOC操作是比较耗资源的,还会造成内存碎片
xiaolifeizei 2009-01-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 Allen_zhang 的回复:]
改成下面这样就行了


C/C++ code
class T
{

//-----
double* vert();

private:
double* m_v; // 定义的类变量
};

T::T()
{
m_v = NULL;
}

T::~T()
{
if ( m_v != NULL )
{
delete[] m_v;
m_v = NULL;
}
}

double* T::vert()
{
if ( m_v == NULL )
m_v = new double[3];

m_v[0]=x;
m_v[1]=z;
m_v[2]=y;
return m_v;
}
[/Quote]

这个比较完美了
OliverQ 2009-01-22
  • 打赏
  • 举报
回复
没搞懂你为什么非这样做不可,我觉得在类里面申请的空间,不应该把指针返回到外部,换言之,楼主的T函数应该是个私有函数才好,或者返回值同时储存在类里面(就像楼上写的代码那样),不然你还封装他干什么?如果是那样的话,应该是在类中定义一个函数,在不需要这个变量时执行(如析构函数里面调用这个函数),来释放空间。
vincent_nicole 2009-01-21
  • 打赏
  • 举报
回复
new和delete要配对使用,可以给减少许多不必要的麻烦
wangyaosuper 2009-01-21
  • 打赏
  • 举报
回复
肯定要delete掉嘛。
passionboy03 2009-01-21
  • 打赏
  • 举报
回复
1.不一定在析构中释放的,用完了建议及时delete掉,也可以放在析构中,在退出类的时候自动调用,省事但是不够及时
2.返回地址没问题的,但是申请的内存以后如果用不到了,要释放掉,这个比较灵活了……
genius52z 2009-01-21
  • 打赏
  • 举报
回复
new是在堆中开辟内存,一定要用delete释放。
double* T::vert()
{
double *v=new double[3];
v[0]=x;v[1]=z;v[2]=y;
return v;
}
int main() {
T t;
double *pdou = t.vert();
delete [] pdou;
return 0;
}
如果不释放main函数结束后,因为存放pdou指针的地址是局部的。所以函数结束会把存放pdou的地址的内存释放掉,但是pdou指向的内存是在堆中开辟的,如果不是释放就会造成内存泄露,没有办法在使用那块内存。因为没有任何指针指向他
waizqfor 2009-01-21
  • 打赏
  • 举报
回复
1请问各位,是不是用new申请的空间必须都要用delete释放
2对于类,是不是应该在析构函数中释放
3若在类中我用new申请的空间以地址形式返回,又怎么办呢(代码如下)


1 用到了 new就一定要用delete来释放 即时释放
2 析构是在失去作用域的时候自动调用 释放
3 跟第一个一样 不管在哪里 用new申请完 都要用delete
pauliuyou 2009-01-21
  • 打赏
  • 举报
回复
vert()函数返回的是堆内存地址. 一定要释放, 一般情况下,尽量用栈内存更好些
nullah 2009-01-21
  • 打赏
  • 举报
回复
是不是用new申请的空间必须都要用delete释放
是的 要配对
对于类,是不是应该在析构函数中释放
在析构函数中释放资源
若在类中我用new申请的空间以地址形式返回,又怎么办呢(代码如下)
还是一样delete啊
xiaoyisnail 2009-01-21
  • 打赏
  • 举报
回复
当在调用vert后不需要再用那块内存时delete


T t;
double *p = t.vert();
...
delete [] p;

65,211

社区成员

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

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