C++释放new分配的内存后,如何判断该指针是否已经释放?可否愿意讲讲new是如何分配内存的?

auto *s1 = new string("hello world"); auto del_ptr = [s1]()mutable{ delete …
关注者
7
被浏览
34,045

7 个回答

C++的new,只会记录两种信息,一个是该变量内存的起始地址,另一个是该变量所占空间,其他东西统统不记录,你所说的标识内存是否释放的机制,C++语言本身是没有的,而根据C++发明人BS的论述,操作已释放的内存是典型的UB。

语言本身有没有方法判断?没有。但可以通过一些设计来避免,最典型的就是智能指针。

raw pointer的话,并非完全没方法,但代价很大,需要你hook进系统的内存管理器,这样你就可以在里面加memory check代码,一旦发现内存被析构两次这种操作,直接抛出异常,在linux 下,你可以用__malloc_hook和__free_hook来完成我说的操作,windows的话,我不清楚,没写过这种代码。这种原理其实和JVM的GC有点像,都是用系统级内存管理器来给你自己应用的内存管理器擦屁股,好处是比较安全,但会牺牲很大的性能,因为记录内存状态非常消耗内存和CPU资源,轻量级程序还好说,企业级应用不适合这么干。