函数参数中new出来的对象怎么释放?

yangbc 2006-11-21 08:52:06
函数参数中new出来的对象怎么释放?
比如 void fuc(new CEntityString("abcd"),1,5)
{

}
这里的new CEntityString("abcd") 出来的空间还需要释放么?
哪位老大讲一下,分数可能不多,大家笑纳
...全文
5916 72 打赏 收藏 转发到动态 举报
写回复
用AI写文章
72 条回复
切换为时间正序
请发表友善的回复…
发表回复
arrowcy 2006-11-26
  • 打赏
  • 举报
回复
我怎么记得在某个地方见到过这种用法,好像是msdn?反正我也就的这种用法有问题,一直没这么用。
良少 2006-11-26
  • 打赏
  • 举报
回复
void fuc(new CEntityString("abcd"),1,5)
{

}
===================================================================
这个函数写得不对。 第一个参数,应该是一个指针,或者对象引用。
new CEntityString("abcd")应该在调用代码中使用。 再在调用代码中释放。不应该在函数中释 放外部生成的对象。否则必然出现错误!
void fuc(CEntityString* temp,1,5)
{
......
delete temp;//此句可以释放内存,避免产生内存泄漏
}
上面这种写法,也是绝对错误的! 会释放已经释放的对象,造成错误!
missilery 2006-11-26
  • 打赏
  • 举报
回复
void fuc(new CEntityString("abcd"),1,5)
{

}
这个就不叫做函数了吧

估计可以这样
void fuc(CEntityString * s = new CEntityString("abcd"),int b=1,float c=2)
{
delete s;
}
xu_yuanjie 2006-11-26
  • 打赏
  • 举报
回复
怎么能这样写呢,到时候谁来释放呢?
keily 2006-11-26
  • 打赏
  • 举报
回复
真郁闷!~
axx1611 2006-11-25
  • 打赏
  • 举报
回复
楼主到底想问什么我还是搞不清楚。不过对于这种写法,并不是一定那么危险和没用,关键是用的人自己得清楚内存到底分配到哪里了,举个例子:

class PStrStack
{
public:
PStrStack() {}
virtual ~PStrStack();
void Push(const string &szNew);
void Push(string *pszNew = new string("abcd"));
private:
vector<string *> m_vecStr;
};

PStrStack::~PStrStack()
{
vector<string *>::const_iterator i = m_vecStr.begin();
for (; i < m_vecStr.end(); i++)
delete *i; // 析构释放string对象空间
}

void PStrStack::Push(const string &szNew)
{
m_vecStr.push_back(new string(szNew)); // 此时string对象空间是由PStrStack分配的
}

void PStrStack::Push(string *pszNew)
{
m_vecStr.push_back(pszNew); // string对象空间由外部分配
}

int main()
{
PStrStack *p = new PStrStack;
p->Push("1234");
p->Push();
string *pStr = new string("try");
p->Push(pStr); // pStr的内存移交给p所指PStrStack对象管理
pStr = NULL; // 避免意外情况,可以先将这个指针置空(根据需要决定)
p->Push(new string("xyz"));
delete p;
return 0;
}

绝不能
string *pStr = new string("string");
p->Push(pStr);
...
delete pStr;
delete p;
这样pStr的空间等于是被delete了两次。。。

happyCore 2006-11-25
  • 打赏
  • 举报
回复
楼上的。。真是不知道楼主在说什么哇。。
zenny_chen 2006-11-25
  • 打赏
  • 举报
回复
To cradmin() :

两者并没有本质上的区别。new操作返回的是动态分配的存储片的首地址,因此在delete时也要用它作为参数。你也可以将new所返回的地址视为memory handle
wstonea 2006-11-25
  • 打赏
  • 举报
回复
长见识了!我正在学c++ 学了相当多的东西
仰望星空WU 2006-11-25
  • 打赏
  • 举报
回复
new出来的都保存在进程的全局堆里,只有自己delete或者给别的对象delete,一定要delete,否则肯定内存leak
jiajiaedu 2006-11-25
  • 打赏
  • 举报
回复
编译没通过.
cradmin 2006-11-25
  • 打赏
  • 举报
回复
不好意思,上面没说完
void main(void)
{
func();
}
想问一下,像这种调用是main函数还是func函数负责调用new来生成的对象,这两者有什么区别吗(是不是在那释放都一样)

我也是新手,不对的地方大家指点!
cradmin 2006-11-25
  • 打赏
  • 举报
回复
to dw14132124()
______________________________
fuc(new CEntityString("abcd"),1,5);

如果这样的函数调用,它在这里生成了临时的一个对象. 它分配了对象所须的空间,然后调用了CEntityString类的构造函数,.它一直作用到函数结束,当函数调用完成时,返回时,生成的这个临时的类会自动被释放.
在这个时候,会调用析构函数,然后释放空间.所以你不必想怎么去释放生成的这个临时对象.
——————————————————————————————————————————
我试了一下,由new生成得对象在其生命周期结束时并没有自动调用对象的析构函数,另外即使在显式调用比如CEntityString的析构函数后,由new申请的那块内存也没有什么变化(应该内存没释放),只有调用delete后那块内存发生了变化(在vc里面看了一下那个地址的内存,改了几个字节,不知道干什了什么),同时还调用了对象CEntityString的析构函数,new和delete应该是成对使用的

想问一下大家,delete时到底做了些什么?

另外 to zenny_chen(ACE Intercessor):
void func(EntityString* = new EntityString("abcd"), int = 1, int = 5)
{

}
liufengping 2006-11-24
  • 打赏
  • 举报
回复
这里new出来的空间当然是需要释放的,要不就是内存泄露了,在函数内构造对象是可以的但是你需要在返回这个构造对象的指针,做好记录,然后适当的时候释放掉它,这种方式一般也是用的比较多的,比如在一个系统中,某个对象(CDog)在系统运行到一定状态是往往需要分派出一个副本常常的做法就是如下申明

CDog* CDog::Clone()
{
CDog* pDog = new CDog;

//code

return pDog;
}

外部释放如下
CDog myDog;
CDog* pCloneDog = myDog.Clone(); //创建副本
delete pCloneDog; //释放副本


如果函数有CDog*形参,就和你的情况是一样的,总之你的函数返回结果应该是new对象的指针
CDog* CDog::Clone( new CDog())
{
//code

return pDog;
}


零点不睡觉 2006-11-24
  • 打赏
  • 举报
回复
新手上路,,在家教下哈,,在哪发问题啊???


零点不睡觉 2006-11-24
  • 打赏
  • 举报
回复
都是高手~~学习一下!
rickerliang 2006-11-24
  • 打赏
  • 举报
回复
笑死我勒~~~~~
yzcurry 2006-11-24
  • 打赏
  • 举报
回复
delete
malligator 2006-11-24
  • 打赏
  • 举报
回复
可以在函数内释放吧
itcsayid 2006-11-24
  • 打赏
  • 举报
回复
楼主是想要嵌套么?
加载更多回复(52)

64,318

社区成员

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

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