C++ 自定义向量返回函数

C++ 自定义向量返回函数,c++,vector,C++,Vector,因此,我试图为我的Vector类实现一个pop\u back()函数,但没有得到预期的结果: 以下是我当前的功能: template <typename T> void Vector<T>::pop_back() { if(vsize > 0){ array[vsize].~T(); --vsize; } } 数组的最后一个元素将位于array[vsize-1]数组的最后一个元素将位于array[vsize-1]除非

因此,我试图为我的
Vector
类实现一个
pop\u back()
函数,但没有得到预期的结果:

以下是我当前的功能:

template <typename T>
void Vector<T>::pop_back() {
    if(vsize > 0){
        array[vsize].~T();
        --vsize;
    }
}

数组的最后一个元素将位于
array[vsize-1]
数组的最后一个元素将位于
array[vsize-1]
除非使用新表达式创建对象,否则不应调用该对象的析构函数。你应该做的是缩小尺寸,保持实际对象不变。除非具有动态存储持续时间,否则在这种情况下,除非使用新表达式创建对象,否则不应调用对象的析构函数。你应该做的是缩小尺寸,保持实际对象不变。除非它具有动态存储持续时间,否则在这种情况下调用
delete
/
delete[]

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

T* array = new T[2];
array[1].~T();
delete[] array; // ERROR: double destruction
如果不先恢复被破坏的数组元素,就无法真正删除该数组


“真实”实现处理这种情况的方式是分配原始内存,例如,使用
void*memory=operator new[](大小)(具有SUBBALE <代码>大小<代码>),或者,如果它是标准C++库容器,则使用适当的分配器函数。容器可以根据需要构造和销毁内存中的对象。被破坏的内存中的实际表示可能仍然不会真正改变,因为大多数析构函数只是去掉了所持有的任何资源,并保留了对象中的位,否则将保持不变,赋予内存中有生命对象的外观,尽管它不是生命对象。

调用数组中某个对象的析构函数对数组没有任何作用,只能将数组的元素置于有趣的状态。特别是,如果您这样做:

T* array = new T[2];
array[1].~T();
delete[] array; // ERROR: double destruction
如果不先恢复被破坏的数组元素,就无法真正删除该数组


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

你的
数组
索引是从1开始的吗?那么它应该是
如果(vsize>=0)
。您的
数组是否从1开始?如果(vsize>=0)
,则它应该是
。我更改了代码以说明这一点,因为您是正确的,但我的函数仍然没有删除最后一个元素。我是否错误地使用析构函数?它被“删除”由于
vsize
少了一个。当你
push_back()时
另一项,它将覆盖刚刚删除的元素。这也是
std::vector
的工作方式。我更改了代码以说明这一点,因为您是正确的,但我的函数仍然没有删除最后一个元素。我是否错误地使用析构函数?它是“已删除的”由于
vsize
少了一个。当你
push_back()时
另一项,它将覆盖刚刚删除的元素。这也是
std::vector
的工作方式。因此我应该在函数中执行
--vsize
,然后将其保留?@ConnorBlack这将是最简单的方法。然而,Dietmar显示了一个更高级的解决方案。因此我应该在函数中执行
--vsize康诺布拉克:这是最简单的方法。迪特玛展示了一个更高级的解决方案。