如何构建C ++程序堆的类型内存映射

时间:2017-11-23 01:12:55

标签: c++

假设不允许重新解释强制转换,我们可以假设堆分配内存的每个区域都有一些类型和值。

因此,对于某个断点处的每个指针,我想知道它指向的对象:

  • 已分配对象的类型
  • 如果指针指向数组元素,我想知道数组中的索引。

可能的解决方案

解决方案我现在想的是记录所有newnew []来电。对于我需要记录的每个新呼叫:

  • 分配类型
  • 已分配对象的大小
  • 新[]
  • 的元素数量

(删除和删除[]也应该跟踪)

目前我最好的想法是: 编写正则表达式以查找源代码中的所有新调用并替换:

带有

的新T()
template<class T, class... Args>
T* my_new(Args&&... args)
{
    std::cout << "new Type: " << typeid(T).name() << " Size: " << sizeof(T) << std::endl;
    return new T(std::forward<Args>(args)...);
}

// example
int *new_int = my_new<int>(12);

新T [n]:

template<class T>
T* my_new_array(size_t n)
{
    std::cout << "new[N] N: " << n << " Type: " << typeid(T).name() << " Size: " << sizeof(T) << std::endl;
    return new T[n];
}

// example
auto *int_vec = my_new_array<std::vector<int>>(12);

有更好的解决方案吗?理想情况下,我不想重写源代码。

我需要在调试器中使用这些信息,因此对于每个指针,我都能理解它指向的位置。即对于内存中的某些任意地址,我可以知道那里有什么。

0 个答案:

没有答案