社区
C++ 语言
帖子详情
函数参数中new出来的对象怎么释放?
yangbc
2006-11-21 08:52:06
函数参数中new出来的对象怎么释放?
比如 void fuc(new CEntityString("abcd"),1,5)
{
}
这里的new CEntityString("abcd") 出来的空间还需要释放么?
哪位老大讲一下,分数可能不多,大家笑纳
...全文
6140
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)
c++
对象
作为
函数参数
c++
对象
作为
函数参数
也分为值传递和引用传递:
对象
也可以作为函数的参数传递给函数,其转递方法与传递其他类型的数据一样,可采用值传递和地址传递两种方法。 值传递时是把
对象
的拷贝而不是本身传递给函数,函数
中
对参数
对象
的任何修改都不会影响调用该函数的
对象
本身; 而地址传递时,调用该函数的
对象
与参数
对象
共用同一个地址,所以,函数对参数
对象
的任何修改都会影响调用该函数的
对象
本身。
从PHP
函数参数
为数组和
对象
的区别说开去
从PHP
函数参数
为数组和
对象
的区别说开去 从PHP函数形式参数为数组和
对象
的区别说开去,首先比较一下函数的参数为数组和
对象
的区别,然后由此说开,谈谈变量的底层结构,
对象
的底层结构,hashTable的底层结构。
函数参数
为数组和
对象
的区别 变量的底层结构
对象
的底层结构 *HashTable —PHP的灵魂
函数参数
为数组和
对象
的区别 先写一个不算很好的例子但是足够说明问题了。...
new
创建
对象
,
对象
保存在堆还是栈?
new
创建
对象
,
对象
保存在堆还是栈? -->堆内存是用来存放由
new
创建的
对象
和数组,即动态申请的内存都存放在堆内存 -->栈内存是用来存放在函数
中
定义的一些基本类型的变量和
对象
的引用变量 例子:局部变量存放在栈;
new
函数和malloc函数申请的内存在堆;函数调用参数,函数返回值,函数返回地址存放在栈 堆和栈的区别 1、栈区(stac
C++用
new
和不使用
new
创建
对象
的区别
一、
new
创建类
对象
与不
new
区别
new
创建类
对象
需要指针接收
new
创建类
对象
使用完需delete销毁
new
创建
对象
直接使用堆空间,而局部不用
new
定义类
对象
则使用栈空间
new
对象
指针用途广泛,比如作为函数返回值、
函数参数
等 频繁调用场合并不适合
new
,就像
new
申请和
释放
内存一样 二、
new
创建
对象
实例 1. 使用
new
创建
对象
CTest* pTest =
new
CTest(); delete pTest; pTest是用来接收类的
对象
指针。
new
申请的
对象
,则只..
原生JS封装_
new
函数,实现
new
关键字的功能
1.前言众所周知:没有
对象
怎么办?那就
new
一个!那么在JS
中
,当我们
new
一个
对象
的时候,这个
new
关键字内部都干了什么呢?2.原始的
new
首先,我们先
new
一个
对象
看看://创建Person构造函数,参数为name,age function Person(name,age){ this.name = name; this.age = age; } //实例化
对象
小明 xm =
new
Pe...
C++ 语言
65,210
社区成员
250,518
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章