c++堆栈模板SIGTRAP错误
C++ Stack Template SIGTRAP Error
刚刚开始学习堆栈模板,每当我尝试释放内存来调整大小时,在使用push函数时遇到了一个问题。该函数在达到最大容量之前一直工作良好,然后立即进入一系列错误消息,而我的调试器并没有真正拾取。下面是导致错误的函数的头文件,加上它调用的函数。
#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 == 10
时,您的isFull()
返回false
,而您的push
试图将值存储在data[10]
中,这是越界的并且会损坏内存。
此外,您的push
应该通过const
参考value
或(如果您使用c++ 11)使用std::move
。
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- c++堆栈模板SIGTRAP错误