这段代码会使这些矢量对齐吗?

时间:2012-01-29 12:28:16

标签: c++ stl alignment

让我说我有:

vector<T *> vect;

我知道这不是明显的方法,但我有一个API可以做到这一点,所以我不能决定使用vector<T>

所以当我把对象放进去的时候我会这样做:

vect.push_back(new T);

此代码是否会确保此向量对齐是连续的,因为它是指针的向量?这个容器会决定new运算符的行为吗?

编辑: 我还需要拨打delete吗?

3 个答案:

答案 0 :(得分:5)

此代码是否会确保此向量对齐,因为它是指针的向量?

不确定您对此上下文中 aligned 的理解是什么,但情况类似于指针数组,其中每个指针都分配了动态内存。指针数组位于连续的位置,每个指针都指向位于堆上某处的内存 在指针元素向量的情况下,这同样适用。

我还需要拨打delete吗?

是的,您需要明确地在每个元素上调用delete 标准库容器不负责在元素为指针的情况下释放元素的内存。

好读:
Does vector::erase() destroy the removed object?

答案 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