C++ c++;使用内存分配销毁函数中的staic变量

C++ c++;使用内存分配销毁函数中的staic变量,c++,memory-management,memory-leaks,static,destructor,C++,Memory Management,Memory Leaks,Static,Destructor,我对c没有什么疑问++ 如何在没有内存泄漏的情况下销毁此代码 void classA::funcA() { static char* cArr = new char[10]; } 只是不要这样写?您可以改用RAII类型或避免分配: static char cArr[10]; static auto cArr2 = std::make_unique<char[]>(10); staticcharcarr[10]; 静态自动cArr2=标准::使_唯一(10); 静态存储中的

我对c没有什么疑问++

如何在没有内存泄漏的情况下销毁此代码

void classA::funcA()
{
    static char* cArr = new char[10];
}

只是不要这样写?

您可以改用RAII类型或避免分配:

static char cArr[10];
static auto cArr2 = std::make_unique<char[]>(10);
staticcharcarr[10];
静态自动cArr2=标准::使_唯一(10);

静态存储中的对象在整个程序期间都存在

如果在整个过程中不使用指向的动态对象,则可以在程序终止之前删除该对象。但如果是这样的话,那么为什么要通过静态存储中的指针拥有对象呢

当静态指针的生命周期结束时,内存从技术上讲是泄漏的,这一事实不是问题,因为程序即将结束


您应该重新考虑的是,首先是否需要静态存储。如果您确实更改了设计以使用自动存储,那么您必须非常小心,不要泄漏内存

实际上,不需要调用delete。是的,这是内存泄漏,因为您没有释放内存,但是静态变量只初始化一次,这意味着您只调用
new
一次,直到程序结束,变量才被销毁,此时所有内存都返回到操作系统。或者使用智能指针确保它被显式删除。尽管如@NathanOliver所述,它将在程序结束时被
删除
ed。@Gupta它不会得到
删除
d,如果依赖析构函数实际执行一些重要的操作,这对于非平凡类型来说可能是个问题。在这种情况下,OP的问题更为相关。@walnut您的意思是在程序结束时,对于非平凡类型不调用静态对象的dtor吗?@Gupta调用静态对象的析构函数,但我的意思是,静态对象是一个指向分配了
new
的非平凡可破坏对象的指针,如OP的示例所示。动态分配的对象的析构函数不会自动调用。