我正在使用 autoexp.dat 和 DLL 扩展 Visual Studio 2003 调试器,以改进它在监 window 口中显示数据的方式。我使用 DLL 而不仅仅是基本的 autoexp.dat 功能的主要原因是我希望能够有条件地显示内容。例如我希望能够说“如果名称成员不是空字符串,则显示名称,否则显示 [其他成员]”
我对 OOP 很陌生,对 STL 没有任何经验。所以可能是我遗漏了显而易见的东西。
我在显示 vector 成员时遇到问题,因为我不知道如何获取指向存储实际值的内存的指针。
我认为这些值存储在连续的内存块中是否正确?有什么方法可以访问指向该内存的指针吗?
谢谢!
[edit:] 澄清我的问题(我希望):
在由调试器调用的我的 DLL 中,我使用了一个名为 ReadDebuggeeMemory 的函数,该函数复制了一个对象使用的内存。它不会复制对象指向的内存。所以我需要知道内部指针的实际地址值,以便能够在其上调用 ReadDebuggeeMemory。目前,获取 vector 内容的常用方法正在返回垃圾,因为尚未复制该内存。
[更新:]
即使我正在查看正确的指针 _Myfirst,我也得到了垃圾,因为我正在创建 vector 的额外拷贝,而我本应使用指向 vector 的指针。所以问题就变成了:如何通过指向 vector 的指针访问指向 vector 内存的指针?这有意义吗?
最佳答案
标准 vector 中的元素被分配为一个连续的内存块。
您可以通过获取第一个元素的地址来获取指向内存的指针,这可以通过以下几种方式完成:
std::vector<int> vec;
/* populate vec, e.g.: vec.resize(100); */
int* arr = vec.data(); // Method 1, C++11 and beyond.
int* arr = &vec[0]; // Method 2, the common way pre-C++11.
int* arr = &vec.front(); // Method 3, alternative to method 2.
但是,除非您需要将底层数组传递给一些旧接口(interface),否则通常您可以直接使用 vector 上的运算符。
请注意,您最多只能访问返回值的 vec.size()
个元素。超出此范围的访问是未定义的行为(即使您认为有为其保留的容量)。
如果你有一个指向 vector 的指针,你可以通过取消引用来做同样的事情:
std::vector<int>* vecptr;
int* arr = vecptr->data(); // Method 1, C++11 and beyond.
int* arr = &(*vecptr)[0]; // Method 2, the common way pre-C++11.
int* arr = &vec->front(); // Method 3, alternative to method 2.
更好的是,尝试获取对它的引用。
关于您的解决方案
你想出了解决方案:
int* vMem = vec->_Myfirst;
只有在特定编译器版本的特定实现上它才会起作用。这不是标准的,因此不能保证它在编译器之间工作,甚至不能保证在不同版本的编译器之间工作。
如果您只在单一平台和编译器上进行开发,这似乎没问题,但最好按照标准方式进行选择。
关于c++ - C++ STL vector 模板如何将其对象存储在 Visual Studio 编译器实现中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1062601/