0

所以我试图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;

};
4

3 回答 3

3

调用数组中对象的析构函数不会对数组做任何事情,只会将数组的元素置于有趣的状态。特别是,如果做这样的事情:

T* array = new T[2];
array[1].~T();
delete[] array; // ERROR: double destruction

如果不首先恢复被破坏的数组元素,您根本无法真正摆脱数组。

“真正的”实现处理这种情况的方式是分配原始内存,例如,使用void* memory = operator new[](size);(使用 suitbale size),或者,如果它是标准 C++ 库容器,则使用适当的分配器函数。容器然后根据需要构造和销毁内存中的对象。被破坏内存中的实际表示可能仍然没有真正改变,因为大多数析构函数只是摆脱任何持有的资源并保持对象中的位保持不变,看起来好像内存中有一个生命对象,尽管它不是。

于 2013-09-29T23:17:31.523 回答
2

数组的最后一个元素将在array[vsize - 1].

于 2013-09-29T23:07:01.343 回答
1

除非使用placement-new 表达式创建对象,否则不应调用对象的析构函数。相反,您应该做的是减小尺寸并保持实际对象不变。除非它具有动态存储持续时间,在这种情况下调用delete/ delete[]

于 2013-09-29T23:17:30.737 回答