社区
C++ 语言
帖子详情
函数参数中new出来的对象怎么释放?
yangbc
2006-11-21 08:52:06
函数参数中new出来的对象怎么释放?
比如 void fuc(new CEntityString("abcd"),1,5)
{
}
这里的new CEntityString("abcd") 出来的空间还需要释放么?
哪位老大讲一下,分数可能不多,大家笑纳
...全文
6032
72
打赏
收藏
函数参数中new出来的对象怎么释放?
函数参数中new出来的对象怎么释放? 比如 void fuc(new CEntityString("abcd"),1,5) { } 这里的new CEntityString("abcd") 出来的空间还需要释放么? 哪位老大讲一下,分数可能不多,大家笑纳
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
腾讯2012笔试题目
此题涉及一个基类`CBase`和一个派生类`CSub`,在`main`函数
中
创建了`CSub`类型的
对象
。需要判断构造函数与析构函数的执行顺序。 - **选项分析:** - A: 先输出子类构造函数,再输出基类构造函数,这不符合C++的...
从PHP
函数参数
为数组和
对象
的区别说开去
从PHP
函数参数
为数组和
对象
的区别说开去 ...
函数参数
为数组和
对象
的区别 变量的底层结构
对象
的底层结构 *HashTable —PHP的灵魂
函数参数
为数组和
对象
的区别 先写一个不算很好的例子但是足够说明问题了。...
JVM里,
new
出来的
对象
是在哪个区?
栈内存是用来存放在函数
中
定义的一些基本类型的变量和
对象
的引用变量 例子:局部变量存放在栈;
new
函数和malloc函数申请的内存在堆;函数调用参数,函数返回值,函数返回地址存放在栈 堆和栈的区别 1、栈区(stack)...
原生JS封装_
new
函数,实现
new
关键字的功能
1.前言众所周知:没有
对象
...2.原始的
new
首先,我们先
new
一个
对象
看看://创建Person构造函数,参数为name,age function Person(name,age){ this.name = name; this.age = age; } //实例化
对象
小明 xm =
new
Pe...
构造函数之
new
运算符解析
我们在开发过程
中
经常会使用
new
运算符实例化
对象
。 比如:let date =
new
Date(); 实际上就是
new
构造函数() 来实例化一个
对象
。任何的函数都可以作为构造函数存在。之所以有构造函数与普通函数之分,主要从功能上...
C++ 语言
65,208
社区成员
250,517
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章