在函数中用new申请的变量的生命周期?

CMyClass *CreateNewClass()
{
   CMyClass *pFirstMyClass = new CMyClass();
  return pMyClass;
}

void DoMyClass()
{
     CMyClass *pMyClass = CreateNewClass();
    ...........
    delete pMyClass;
}

近期看C++说是在函数中申请的临时变量的生命周期只存在该函数内。请问在CreateNewClass()用new申请的变量,在DoMyClass()中可以使用吗?变量pFirstMyClass 存在的生命周期?

new只是动态申请内存,动态申请的内存不会自动回收,需要你主动free
然而变量本身的生命周期不变,出了函数你就没法再访问它了,那么动态申请的内存没有指针去指向它,它就变成了垃圾内存,会造成内存泄漏
所以在函数里动态申请了内存之后,你需要把指针传递出来,要么通过函数返回值return,要么通过形参传递回来
-=-=-==-=
回到你的代码,你上面的函数写错了,pMyClass 不存在,应该是return pFirstMyClass
那么DoMyClass本来就是在调用CreateNewClass,pMyClass 这个指针指向的就是动态申请的内存,这是没问题的
pFirstMyClass 这个变量确实已经被回收,但是不代表指针指向的内存被回收了
而且这种用法还就得用new+free,如果是直接CMyClass pFirstMyClass,出了函数它的内存可能就被回收了,那pMyClass就是个野指针

完全是可以使用的,只要是用一个指针去接住这个地址就可以,用完了销毁就行。不销毁会内存泄漏。

在函数CreateNewClass()中用new申请的变量pFirstMyClass的生命周期是整个程序的生命周期,因为new申请的内存是在堆上分配的,不会在函数调用结束后被释放。在函数DoMyClass()中可以使用pFirstMyClass。

  • 但是在代码中,CreateNewClass函数并未返回pFirstMyClass而是返回了pMyClass,这个pMyClass并不存在,所以这个函数会有问题,编译器可能会报错。
  • 如果要在DoMyClass()中使用pFirstMyClass,需要在CreateNewClass()中返回pFirstMyClass,并在DoMyClass()中使用返回值。之后在DoMyClass中使用delete进行释放。

正确的写法是:

CMyClass *CreateNewClass()
{
   CMyClass *pMyClass = new CMyClass();
  return pMyClass;
}
 
void DoMyClass()
{
     CMyClass *pMyClass = CreateNewClass();
    ...........
    delete pMyClass;
}

第一个函数应是:return pFirstMyClass;