读书人

高手理解一上

发布时间: 2012-11-10 10:48:51 作者: rapoo

高手理解一下!
class Person
{
....
}

class TestPerson
{
public:
Person & GetPerson()
{
Person p;
return p;
}
Person GetPerson1()
{
Person p;
return p;
}

Person* GetPerson2()
{
Person* p = new Person();
return p;
}
}

Main()
{
TestPerson tp;
Person pson = tp.GetPerson();//1
Person pson1 = tp.GetPerson1();//2
Person* pson2 = tp.GetPerson2();//3
}

请问123这几种情况下的内存分配情况,及如何释放.

像3情况NEW出来的内存,如何释放,当delete pson2时,是释放了本身pson2还是NEW出来的P.还有情况一和2.

还有这些情况下怎么使用才保证安全.

[解决办法]
12的操作很危险
3需要delete
[解决办法]

探讨
哪请问怎么delete呢

[解决办法]
1是错的 不要这么用 栈空间已销毁 不能引用它
2 可能调拷贝构造 这时有个深浅拷贝的问题 也可能NRV优化
3 在外面需要delete

不明白的地方 google搜一下 关键字
[解决办法]
Person* pson2 = tp.GetPerson2();//3
//code ...
delete pson2;
[解决办法]
delete pson2;
pson2 = NULL;
--------------
GetPerson函数返回一个局部变量的引用是不对的
[解决办法]
不理解你意思
探讨
在函数外执行delete pson2是这样吗?哪这样后,pson2本身的内存呢?怎么释放

[解决办法]
个人感觉 要是写了合适拷贝构造函数的话

第一条和第二条都没有什么问题, 因为在语句结束的话 已经使用临时对象完成了拷贝构造

但是第三条直接delete就可以了 没什么问题的
[解决办法]
那你为什么不考虑释放pson,pson1的内存呢?
[解决办法]
情况1和2都是返回的局部变量的东西,是很危险的,因为返回的对象实际上已经销毁了。

情况3返回new出来对象,这种情况可以,但是用完后需要手动删除,如下:
delete pson2;
pson2 = NULL;
[解决办法]
探讨
哪请问怎么delete呢

[解决办法]
探讨
class Person
{
....
}

class TestPerson
{
public:
Person & GetPerson()
{
Person p;
return p;
}
Person GetPerson1()
{
Person p;
……

[解决办法]
探讨

1是错的 不要这么用 栈空间已销毁 不能引用它
2 可能调拷贝构造 这时有个深浅拷贝的问题 也可能NRV优化
3 在外面需要delete

读书人网 >C++

热点推荐