C++ 反转堆栈时出错,您能指出吗?

C++ 反转堆栈时出错,您能指出吗?,c++,stack,reverse,C++,Stack,Reverse,好的,首先我已经编写了这个方法,预先搜索了stackoverflow,并注意到了我的 这个想法与大多数人的做法是一致的,但是,堆栈实际上并没有反转,而是加入了奇怪的值: 我是这样做的:我用条件大小做了一个辅助堆栈和一个while循环!=0,然后我调用aux.push(pop()),因为pop方法也返回已删除的元素,所以堆栈应该反转,时间复杂度为O(n)。但是,这种情况发生了: 要反转的堆栈:A C D F->结果:ĐĐ` 我运行了一个内存泄漏测试仪,它告诉我有4次尝试释放已经释放的空间,所以我想

好的,首先我已经编写了这个方法,预先搜索了stackoverflow,并注意到了我的 这个想法与大多数人的做法是一致的,但是,堆栈实际上并没有反转,而是加入了奇怪的值:

我是这样做的:我用条件大小做了一个辅助堆栈和一个while循环!=0,然后我调用aux.push(pop()),因为pop方法也返回已删除的元素,所以堆栈应该反转,时间复杂度为O(n)。但是,这种情况发生了:

要反转的堆栈:A C D F->结果:ĐĐ`

我运行了一个内存泄漏测试仪,它告诉我有4次尝试释放已经释放的空间,所以我想这可能是原因

更多详情:

堆栈实现为动态数组

以下是具有相关功能的代码:

template<typename T>
bool NizStek<T>::push(const T& element){

if(_size == _capacity) increaseCapacity();
if(_size == 0){

    _brojE++;
    _top++;
    _array[_top] = new T(element);

}
else{

    _size++;
    ++_top;
    _array[_top] = new T(element);

}


}
模板
bool-NizStek::push(常量T和元素){
如果(_size==_容量)增加容量();
如果(_size==0){
_brojE++;
_top++;
_数组[_top]=新的T(元素);
}
否则{
_大小++;
++_顶部;
_数组[_top]=新的T(元素);
}
}
POP功能:

template<typename T>
T NizStek<T>::pop(){

if(_size == 0) throw "Stack is empty";
T oldTop = *_array[_top];

delete _array[_top];
_top--;
_size--;

return oldTop;
}
模板
T NizStek::pop(){
如果(_size==0)抛出“堆栈为空”;
T oldTop=*_数组[_top];
删除_数组[_top];
_顶部--;
_大小--;
返回oldTop;
}
反向功能:

 template<typename T>
 void NizStek<T>::reverse() {

NizStek<T> aux;
while(size() != 0){

    aux.push(pop());
}

*this = aux;
}
模板
void NizStek::reverse(){
尼兹特克奥克斯;
while(size()!=0){
辅助推(pop());
}
*这=辅助;
}
复制构造函数(运算符=与第一行相同,即delete[]\u array;)

模板
NizStek::NizStek(康斯特NizStek&rhs){
_尺寸=rhs.\u尺寸;
_容量=rhs.\u容量;
_niz=新的T*[_容量];

对于(int i=0;i,由于您没有显示它,我猜您正在让编译器创建副本构造函数,它将执行浅层复制。因此:

template<typename T>
void NizStek<T>::reverse()
{
    NizStek<T> aux;
    while(size() != 0)
    {
        aux.push(pop());
    }
    *this = aux; // Potential problem here!
}
分配将创建一个指针数组,而不是一个对象数组。因此,您将拥有一个未分配指针数组(
this
aux
将指向相同的项,因此当
aux
在其析构函数中清除它们时,您仍然指向垃圾)。我认为您想要的是

_niz = new T[_capacity]; // note the lack of *

for(int i=0; i<_size ;i++) 
    _array[i] = rhs._array[i];

_top = rhs._top;
\u niz=newt T[\u capacity];//注意缺少*

对于(int i=0;iYou尚未向我们展示您的复制构造函数的外观…这可能是您的大问题所在…我添加了构造函数,我需要将一些名称翻译为英语,所以花了一些时间:)@Matsura在你最初发布的push函数中,我假设你忘了将_vrh重命名为_top?是的,对此很抱歉。在类属性中,我将数组定义为T**U数组,因此我必须创建一个新的指针数组,否则在编译时会出错使用
T**
的方法的问题是你是cop计算指针值,而不是它们实际指向的值…因此最终会出现相同的悬空指针问题。
_niz = new T*[_capacity];

for(int i=0; i<_size ;i++) 
    _array[i] = rhs._array[i]; // this is still a shallow copy!

_top = rhs._top;
_niz = new T[_capacity]; // note the lack of *

for(int i=0; i<_size ;i++) 
    _array[i] = rhs._array[i];

_top = rhs._top;
_niz = new T*[_capacity];

for(int i=0; i<_size ;i++)
{ 
    _array[i] = new T(*rhs._array[i]); // actually do a deep copy
}

_top = rhs._top;