2016-07-07 46 views
0

在正在运行的程序中,如何跟踪/打印对象已分配的堆内存量?有没有办法打印对象已分配的堆内存量?

例如:

#include <iostream> 
#include <vector> 

int main(){ 

    std::vector<int> v; 

    std::cout << heap_sizeof(v) << '\n'; 

    for (int i = 0; i < 1000; ++i){ 
    v.push_back(0); 
    } 

    std::cout << heap_sizeof(v) << '\n'; 
} 

是否有可替代heap_sizeof()的实现?

+0

在一般情况下,只针对特定平台。它与堆的实现非常相关。 –

+0

谁应该shared_ptr <>的数量为? – lorro

+0

'std :: cout << sizeof(int)* v.capacity()<< endl;' – GreatAndPowerfulOz

回答

1

,因为它的设计,开箱即用,不,这是不可能的。尽管如此,你还是有几个选择。

如果你只需要这个标准容器,你可以实现一个分配器来跟踪已经通过分配器分配(而不是释放)的内存。

如果你想要这个能力通过new分配的一切,你(无论是容器或没有)可以提供一个全球性的和/或类特定的基础上,自己实现operator new,并将它(例如)建立一个无序从指针到块大小的映射来告诉你它被分配的任何块的大小(因此,你必须提供一个函数来检索这个大小)。取决于平台,这也可以使用特定于平台的功能来实现。例如,当你正在为微软的编译器(当然,库,真的)构建的时候,你的operator new的实现根本不需要做任何特殊的事情,并且检索块的大小的函数看起来像这样:

size_t block_size(void const *block) { 
    return _msize(block); 
} 

另一种可能性是将每个被请求块的分配大小增加一个足够大的整数的大小来保存该大小。在这种情况下,您将分配一个比用户所请求的更大的数据块,并将该块的大小存储在返回的块的开头。当用户请求一个块的大小时,你从它们传递的指针取出正确的(负)偏移量,并返回你存储在那里的值。

1

首先,v分配在堆栈上,而不是在堆上。如果你想不计较std::vector对象本身的大小(发现on this article,并修改了一下)

template <typename T> 
size_t areaof (const vector<T>& x) 
{ 
    return sizeof (vector<T>) + x.capacity() * sizeof (T); 
} 

要获取的空间通过它使用的总量,我建议使用此功能中,与sizeof删除部分:一切

template <typename T> 
size_t heap_sizeof (const vector<T>& x) 
{ 
    return x.capacity() * sizeof (T); 
} 
+2

'v'可能在堆栈中,但它的内容在堆上。 – GreatAndPowerfulOz

+0

当然可以。我只想指出v是在栈上(在他的例子中)。 –

+0

好的。疑难杂症。澄清。 – GreatAndPowerfulOz

0

如果您不关心每个对象分配的内容,更关心在指定时间内分配/释放了多少内存,则可以使用malloc统计函数。每个malloc都有自己的版本。在linux上,你可以使用mallocinfo()

相关问题