自定义矢量pop_back函数

时间:2013-09-29 23:02:32

标签: c++ vector

所以我正在尝试为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;

};

3 个答案:

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