none
取得堆内存大小 RRS feed

  • 问题

  • 谢谢诸位关注!

    唔。。我想请问下,在c++中,有方法取得在堆上分配的内存的大小的标准库或非标准库方法吗?

    我似乎在《c++编程思想思想》上看到一个函数,该函数以_或__开头。当时没有太在意,现在要用的时候找不到了。。。google了很久没有找到。

     

    如果有,请指出是标准库方法还是非标准库方法,在哪个头文件中,谢谢!

    2010年5月3日 23:24

答案

  • __开头的是微软的C++扩展,不是标准的一部分。

    一个程序可以有多个堆,比如静态链接CRT的每个DLL都有一个堆,动态链接同一个版本的CRT的代码共享一个CRT堆、托管代码共享一个托管堆等等。你可以用_heapwalk遍历在当前模块使用的CRT堆上分配的内存。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年5月4日 0:15
    版主
  • CRT的内存管理没有提供这方面的接口。你可以自己写一个提供此功能的内存管理器来替换CRT。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年5月4日 12:18
    版主

全部回复

  • __开头的是微软的C++扩展,不是标准的一部分。

    一个程序可以有多个堆,比如静态链接CRT的每个DLL都有一个堆,动态链接同一个版本的CRT的代码共享一个CRT堆、托管代码共享一个托管堆等等。你可以用_heapwalk遍历在当前模块使用的CRT堆上分配的内存。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年5月4日 0:15
    版主
  • __开头的是微软的C++扩展,不是标准的一部分。

    一个程序可以有多个堆,比如静态链接CRT的每个DLL都有一个堆,动态链接同一个版本的CRT的代码共享一个CRT堆、托管代码共享一个托管堆等等。你可以用_heapwalk遍历在当前模块使用的CRT堆上分配的内存。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP


    谢谢您的回复。让我了解了不少。

    _heapwalk在很多时候是一个有用的函数,但我希望能知道若我给定一个指向堆的指针(由new type[]分配),有函数能判断该指针指向的位置所分配的大小吗?

    再提出一个关于栈的问题:

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    #include<iostream>
    using namespace std;
    void out(int * p)
    {
     cout<<sizeof(p)/sizeof(*p)<<endl;
    }
    int main()
    {
     int tmp[10];
     cout<<sizeof(tmp)/sizeof(*tmp)<<endl;
     cout<<"~~~~~~~~~~~~~~~"<<endl;
     out(tmp);
    }

    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    关于sizeof(tmp)/sizeof(*tmp)的机制到底是怎么样的呢?

    tmp应该是一个指针,为一个int大小,但在main函数中,该语句可以得到数组的大小(10),而当我传递了这个指针到其他函数之后,却发现这个指针在其他函数中被“正常”的解释了。

    请问这是为什么?

    2010年5月4日 4:13
  • CRT的内存管理没有提供这方面的接口。你可以自己写一个提供此功能的内存管理器来替换CRT。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年5月4日 12:18
    版主