让我说我有:
vector<T *> vect;
我知道这不是明显的方法,但我有一个API可以做到这一点,所以我不能决定使用vector<T>
。
所以当我把对象放进去的时候我会这样做:
vect.push_back(new T);
此代码是否会确保此向量对齐是连续的,因为它是指针的向量?这个容器会决定new
运算符的行为吗?
编辑:
我还需要拨打delete
吗?
答案 0 :(得分:5)
此代码是否会确保此向量对齐,因为它是指针的向量?
不确定您对此上下文中 aligned 的理解是什么,但情况类似于指针数组,其中每个指针都分配了动态内存。指针数组位于连续的位置,每个指针都指向位于堆上某处的内存 在指针元素向量的情况下,这同样适用。
我还需要拨打delete
吗?
是的,您需要明确地在每个元素上调用delete
标准库容器不负责在元素为指针的情况下释放元素的内存。
答案 1 :(得分:1)
您希望将许多T *推入向量,以使指向的对象是连续的。各种T *将彼此相邻,但您还希望T对象彼此相邻。如果您事先知道项目数,可以这样做:
T* arr = new T[N];
for(int i = 0; i<N; ++i) {
vect.push_back(&(arr[i]));
}
要删除,您必须致电delete[] vect[0];
。您只在第一项上调用删除。如果您delete
其他人,您将获得未定义的行为。
(我仍然不知道为什么你希望它们是连续的。)
答案 2 :(得分:0)
指针在内存中是连续的,就像
一样 T* array[]
这是由标准保证的。但是,向量将重新分配特定操作(例如增长容量);标准也很好地定义了这一点。阅读
std::vector<>::resize
std::vector<>::reserve
std::vector<>::capacity
std::vector<>::size
只要没有触发重新分配,矢量就可以像数组一样对待。
链接:http://en.cppreference.com/w/cpp/container/vector/reserve