我反对我的指针向量问题... 我知道问题可能是什么:
当我创建一个指向向量的指针时,指针会保留堆上向量的大小。所以这基本上意味着,指针现在指向向量的内存而没有任何内部......当我现在调整大小或推回向量时,指针现在仍然指向向量的整个内存或只是指向内存的内存在开始时被分配了吗?
我也想知道,如果有一些技巧可以解决这个问题(如果我认为是真的)。是" vector.reserve(n)"一种完成这个的方法?或者有什么我可以做的事情来覆盖指针内存地址,它被初始化后的向量?
答案 0 :(得分:5)
"当我创建一个指向向量的指针时,指针会保留堆上向量的大小。
不,它没有!当你创建一个指向矢量的指针时,你有一个指针。而已。它还没有指向任何东西,它当然没有保留任何堆内存"对你而言。
您仍然需要实际创建将指向的矢量。
std::vector<int>* ptr1; // just a pointer;
ptr1 = new std::vector<int>(); // there we go;
delete ptr1; // don't forget this;
auto ptr2 = std::make_shared<std::vector<int>>(); // alternatively...
Y&#39;知道,您需要动态分配容器非常罕见。通常你只想以通常的方式构建它:
std::vector<int> v;
那就是它。不需要指针。
当我现在调整大小或推回向量时,指针现在仍然指向向量的整个内存或者只是指向开头分配的内存吗?
无论你如何构造/分配它,向量本身都不会自发移动(只有内部为你管理的动态内存),所以你不必担心这个。
我也想知道,如果有一些技巧可以解决这个问题
没有必要,因为没有什么可以解决的。
&#34; vector.reserve(n)&#34;一种实现这个目标的方法?
理论上,如果 是一个问题(它不是),那么,是的,这可能构成解决方案的基础。
答案 1 :(得分:1)
Vector是一个类,它具有使用堆中连续内存块的向量元素的内部指针。足够长的时间用于所有保留的向量元素(capacity()方法) 所以,如果你创建了vector(在本地范围&#39;堆栈中或堆中 - 并不重要),它会创建这个布局
[ vector [ ptr-to-data ] ] --> HEAP: [ 1 ][ 2 ][ 3 ]
vector<int> v1(3); // whole vector instance in the stack
vector<int> *pv2 = new vector<int>(3); // pointer to vector in the heap
这两个矢量实例中的每一个都有指向堆中元素的指针
Vector在内部管理其指向数据的指针。 当push_back()比当前的.capacty()更多的元素时,它将重新分配新的连续内存块并复制构造或将所有旧元素移动到这个新块。