有没有办法打印对象分配的堆内存量?

时间:2016-07-07 20:46:43

标签: c++ memory-management heap-memory allocation

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

例如:

  //MARK: Language change

  //used to change language text for imediate screens
  func setText(){
    locationsLabel.text = "Locations".localized()
    languageLabel.text = "Languages".localized()
    termsOfUseLabel.text = "Terms of Use".localized()
    privacyPolicyLabel.text = "Privacy Policy".localized()
    pushNotificationsLabel.text = "Push Notifications".localized()
    contactUsLabel.text = "Contact Us".localized()
  }


  // Changes text to current language
  override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "setText", name: LCLLanguageChangeNotification, object: nil)
  }

  // Remove the LCLLanguageChangeNotification on viewWillDisappear
  override func viewWillDisappear(animated: Bool) {
    super.viewWillDisappear(animated)
    NSNotificationCenter.defaultCenter().removeObserver(self)
  }

是否有可以替代#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'; } 的实现?

3 个答案:

答案 0 :(得分:1)

首先,v在堆栈上分配,而不是在堆上。

要获得它使用的总空间量,我建议使用此功能:(找到on this article,并稍作修改)

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

如果您不想计算std::vector对象本身的大小,请使用sizeof删除该部分:

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

答案 1 :(得分:1)

一切都是开箱即用的设计,不,这是不可能的。你可以自己做几个选择。

如果您需要专门用于标准容器,则可以实现一个分配器,该分配器跟踪通过该分配器分配(而不是释放)的内存。

如果您希望通过new分配的所有功能(无论是否为容器),您可以在全局和/或特定类别的基础上提供自己的operator new实现,并拥有它(例如)从指向块大小的指针构建一个无序映射,告诉你它分配的任何块的大小(并且,你必须提供一个函数来检索该大小)。根据平台的不同,这也可以使用特定于平台的功能来实现。例如,当您为Microsoft的编译器(好吧,库,真的)构建时,operator new的实现根本不需要执行任何特殊操作,并且要检索的功能块的大小看起来像这样:

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

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

答案 2 :(得分:0)

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