簡體   English   中英

C ++堆棧模板SIGTRAP錯誤

[英]C++ Stack Template SIGTRAP Error

剛開始學習堆棧模板時,每當我嘗試釋放內存以調整大小時,在使用推功能時就會遇到問題。 該功能一直很好,直到達到最大容量為止,然后立即進入一系列錯誤消息,這些消息不是我的調試器真正接收到的。 這是帶有導致錯誤的函數的頭文件,以及它所調用的函數。

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

template <class T>

class MyStack
{
  private:
  T* data;
  int topVal;
  int capacity;

  public:
  MyStack()
  {
    capacity = 10;
    topVal = 0;
    data = new T[capacity];
  }

  ~MyStack()
  {
    delete [] data;
    data = 0;
  }
  void push(T);
  T pop();
  T top();
  bool isFull();
  bool isEmpty();
  string toString();
};

template <class T>
void MyStack<T>::push(T value)
{
  if(!isFull())
  {
    data[++topVal] = value;
  }
  else
  {
    capacity *= 2;
    T* holdPtr = new T[capacity];
    for(int i = 0; i <= topVal; ++i)
      holdPtr[i] = data[i];
    delete [] data;                 //This is where the error is occurring
    data = holdPtr;
    data[++topVal] = value;
  }
}


template <class T>
bool MyStack<T>::isFull()
{
  if(topVal < capacity)
    return false;
  else
    return true;
}

任何幫助將不勝感激。

編輯:問題解決了! 感謝您的所有幫助!

兩個(相關)問題:

1)對於空堆棧, topval == 0 但是您的push將元素放入data[++topVal] -即data[1] 永遠不會使用data[0]

2)當topval == 9並且capacity == 10topval == 9 isFull()返回false並且您的push嘗試將值存儲在data[10] ,該值越界並損壞內存。

另外,您的push應該通過const引用獲取value ,或者(如果使用的是C ++ 11)請使用std::move

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM