假设不允许重新解释强制转换,我们可以假设堆分配内存的每个区域都有一些类型和值。
因此,对于某个断点处的每个指针,我想知道它指向的对象:
可能的解决方案
解决方案我现在想的是记录所有new
和new []
来电。对于我需要记录的每个新呼叫:
(删除和删除[]也应该跟踪)
目前我最好的想法是: 编写正则表达式以查找源代码中的所有新调用并替换:
带有
的新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);
有更好的解决方案吗?理想情况下,我不想重写源代码。
我需要在调试器中使用这些信息,因此对于每个指针,我都能理解它指向的位置。即对于内存中的某些任意地址,我可以知道那里有什么。