首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

高手理解一上

2012-11-10 
高手理解一下!class Person{....}class TestPerson{public:Person & GetPerson(){Person preturn p}Pers

高手理解一下!
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

热点排行