Quantcast
Channel: 看雪安全论坛
Viewing all articles
Browse latest Browse all 9556

【讨论】关于CRT里的heapinit.c

$
0
0
最近在研究Dll的CRT初始化过程.
在网上查了些关于CRT初始化堆的资料.
网上的heapinit.c中的_heap_init的代码如下:
代码:

int __cdecl _heap_init (int mtflag) 

        //  Initialize the "big-block" heap first. 
        if ( (_crtheap = HeapCreate(  HEAP_NO_SERIALIZE, BYTES_PER_PAGE, 0 )) == NULL ) 
            return 0; 
 
        // Pick a heap, any heap 
        __active_heap = __heap_select(); 
 
        return 1; 
}

而我的VS 2012中的heapinit.c中的_heap_init的代码却更网上的不一样:
代码:

int __cdecl _heap_init (void)
{
        //  Initialize the "big-block" heap first.
        if ( (_crtheap = GetProcessHeap()) == NULL )
            return 0;

        return 1;
}

请问为什么在VS 2012中.堆的初始化不创建一个新的堆.而是使用进程默认的堆呢?
有没有什么办法使CRT重新创建一个新的堆呢?

我个人认为,如果DLL使用HeapCreate创建的堆的话,如果Dll存在内存泄露.
那么在Dll被卸载时.是不是所泄露的内存会被回收呢?

Viewing all articles
Browse latest Browse all 9556

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>