嵌套c++向量的重新定位
Reallocation of nested c++ vectors
假设我们有一个包含std::vector
容器的结构:
struct A {
char a; // decoration
vector<int> v;
A() {}
};
在我们的代码中的某个时刻,我们有一个std::vector
存储这些A
结构(也就是说,两个级别的std::vector
s),然后,我们在它的一个元素上为v
保留更多的内存空间:
/*...*/
vector<A> vect;
vect.resize(10, A());
vector<A>* vect_ptr = &vect;
vect[0].v.reserve(9999999);
cout << vect_ptr << " ?= " << &vect << endl;
/*...*/
问题是:在为其中一个"低级"向量v
保留空间后,是否存在"高级"向量vect
被重新分配,使指针vect_ptr
无效的风险?
在肯定的情况下,将v
重新定义为参考是否是解决方案?(即使它增加了间接级别):
struct A {
char a;
vector<int>& v;
A() : v(vector<int>()) {}
};
否。不存在这样的风险。
vect
拥有一些内存,它在其中写入了一堆A
:所以可能在内存中有这样的东西:
[--A--][--A--][--A--]...[--A--]
^ ^
&vect[0] &vect[9]
但这些A
中的每一个都有一些向量,指向其他地方的更多内存。以下是vect[1].v
可能指向的粗略说明:
[int][int][int][int][int]...
^
|
[--A--][--A--][--A--]...[--A--]
^ ^
&vect[0] &vect[9]
(我为可怕的ascii艺术道歉)
这两个容器拥有它们自己的内存,这些内存不重叠。调整其中一个"内部"向量的大小可能会改变它拥有的内存,但这与vect
拥有的内存无关(除非分配器严重损坏,而std::allocator
不是)。您可以将vect
的内存视为完全禁止其他任何东西尝试分配的内存。在一个"内部"向量中尝试分配多少并不重要。在某些情况下,您将无法分配那么多内存,但永远不会有重新分配任何其他对象的风险。
也许吧。我认为标准实际上并不能保证这一点。它是实现定义的,应该适用于std::vector的大多数实现。但这不是你可以信赖的
也许迭代器具有引用原始容器的传统调试信息——你会遇到麻烦。
相关文章:
- 重新定位图像时如何前进到下一个内存块
- 流填充字符的默认定位
- 通过Python Distutils(用于Python C扩展)使用可重定位的设备代码编译CUDA代码
- 为什么gmp会在这里与"invalid next size"重新定位一起崩溃?
- NS3 - python.h 文件无法定位编译错误
- 设置我的应用程序 API 感知并防止系统使其模糊和错误定位
- GLEW 未在 MSYS2 上定位 OpenGL 函数
- c++ 链接器错误"针对'.rodata.str1.1'的重新定位R_X86_64_32"链接 CXX 共享库 libsrt.so
- 如何忽略32位整数中的特定位
- 如何在C++中使用光标定位
- 使用 stdio.h 重新定位和重命名文件C++
- R 包安装错误:重新定位 0 具有无效的符号索引 11
- 对于可重定位的多平台安装,理想的 cmake 安装目录结构是什么?
- 不能使用使用 lib*.a 的 CDT ---对符号 .. 的重新定位R_X86_64_32S
- 如何在VS2015中重新定位VS2017解决方案?
- 使用 for_each 和 lambda 销毁已定位的对象
- 在"for loop"中使用GOTOXY定位
- 是否可以为虚幻引擎/Unity制作64位定位系统?
- 干净地破坏动态定位对象的向量
- 使用ENVDTE时的Java脚本-将新项目添加到现有解决方案中,并将其定位在特定的子文件夹中