c++ - C++ STL vector 模板如何将其对象存储在 Visual Studio 编译器实现中?

标签 c++ visual-studio stl vector

我正在使用 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/

相关文章:

c++ - 在 C++ 中有选择地替换 std::string 中的 (") 双引号

c# - Surface 2.0 SDK 还在使用吗?

visual-studio - 在 Visual Studio 中创建 WiX Bootstrapper 时是否需要 2 个 WIX 项目?

数组类型的 C++ 伪析构函数

C++ 对于哪些类型,参数类型名称可以与带类型说明符的参数名称相同?

c++ - 为什么从构造函数抛出异常时会发生内存泄漏?

c++ - 如何在内联回调函数中使用 EXPECT_EQ 和其他 Google Mock 语句?

.net - 抑制 MSB3276 : Found conflicts between different versions

c++ - 通过使用指令调用开始和结束?

c++ - 模拟一堆卡片的最佳容器