描述:
通过ATL Com模板建立了一个基于服务(Server Exe)的Com程序,在该程序中,加入了几个类(Generic Class),并且在启动该服务的时候,new 了几个类对象,在类的析构函数中进行了Delete,可以在进行调试的时候,当通过:任务管理器/进程 关闭该Com服务程序的时候,却不能调用这些类的析构函数,请问:new 的内存是否被释放
解决方案1:
可能释放可能没释放,要视你所选择的C运行时期库是否是动态连接的。如果静态连接,则是释放了的,不过不是通过调用你的析构函数中的delete,而是系统自己释放的。动态连接则就是真正的内存泄露。
因为你的这种情况只是所谓的内存泄露,不是资源泄露,内存泄露是指当泄露内存的进程未结束时才有所谓的泄露,当进程结束时,它所分配的所有内存都会释放(资源不一定,要视引用记数而定)。但这里所谓的内存也只是进程的堆(其实仍是个资源)。由于你使用new,将不会在进程的默认堆上进行分配,而是在C运行时期库初始化时申请的一个堆上进行分配。因此,当进程结束时,将不会释放C运行时期库申请的堆,只有C运行时期库被卸载时,才会释放你所分配的内存。
当你的C运行时期库静态连接时,进程结束时,C运行时期库也将卸载,所以将会释放。当动态连接时,连接的是MSVCRT.DLL,所以只有当MSVCRT.DLL卸载时(即如果你的进程结束时还有其他进程使用C运行时期库,那么将不会卸载MSVCRT.DLL),你分配的内存才会释放。
至于C运行时期库的指定(静态连接还是动态连接,多线程还是单线程),通过编译器选项指定,VC6中,在Project/Settings,VC.net中,在工程的属性对话框中