所以我正在尝试为pop_back()
课程实现Vector
函数,但我没有得到预期的结果:
这是我目前的职能:
template <typename T>
void Vector<T>::pop_back() {
if(vsize > 0){
array[vsize].~T();
--vsize;
}
}
为什么不删除数组中的最后一个元素?
这是我的.h
:
template <typename T>
class Vector {
public:
Vector();
~Vector();
void push_back(const T &e);
int size() const;
void pop_back();
void allocate_new();
T operator[](int index);
private:
Vector(const Vector<T> & v);
Vector<T> & operator=(const Vector<T> &);
int vsize;
int capacity;
T* array;
};
答案 0 :(得分:2)
数组的最后一个元素位于array[vsize - 1]
。
答案 1 :(得分:2)
调用数组中对象的析构函数除了将数组元素置于滑稽状态之外,不会对数组执行任何操作。特别是,如果做这样的事情:
T* array = new T[2];
array[1].~T();
delete[] array; // ERROR: double destruction
如果没有首先恢复被破坏的数组元素,你根本无法摆脱数组。
“真实”实现处理这种情况的方式是分配原始内存,例如,使用void* memory = operator new[](size);
(使用suitbale size
),或者,如果它是标准C ++库容器,则使用适当的分配器功能。容器比根据需要构造和破坏内存中的对象。被破坏的内存中的实际表示可能仍然没有真正改变,因为大多数析构函数只是去除了所持有的任何资源,并且保留了对象中的位,否则保持不变,从而给出外观,就好像在内存中存在生命对象,尽管它不是。
答案 2 :(得分:1)
除非使用placement-new表达式创建对象,否则不应调用对象的析构函数。你应该做的是减小尺寸并保持实际物体不变。除非它具有动态存储持续时间,否则请拨打delete
/ delete[]
。