如果我们在C ++中使用数组实现堆栈,那么减少溢出情况的最佳方法是什么?还要记住时空交易吗?
答案 0 :(得分:6)
当你接近“溢出条件”时,即当下一个元素不再适合时,只需调整数组大小。或者使用std::vector
,您可以轻松调整大小。
不确定,但您知道std::stack
类,它实现了一个在C ++中自动调整大小的堆栈?
[编辑]如果你不想调整大小但是没有正确地失败,抛出异常是你能做的最好的事情。例如,您可以定义StackOverflowException
并在没有剩余空间的情况下抛出它,以便客户端做出反应。
答案 1 :(得分:1)
您可以使用std :: stack来实现堆栈。如果您正在寻找作业答案,请保留一系列数据项(或指向它们的指针)。随着堆栈的增长或缩小,此阵列可能会增长或缩小。增长/收缩因子*决定了您对速度或尺寸优化的关注程度。
*通过增长/收缩因子,我指的是在增长或缩小时添加或删除的元素数量。这些是自然的二次幂值或倍数,因为您可以加上或乘以一个简单的数字(例如+ = 4096,* = 2)。使用大值有助于防止堆栈大小调整,从而导致代码更快,但会消耗更多内存。较小的值具有相反的效果,甚至可能导致非MMU系统(如某些便携式设备)上的内存碎片。对于使用存储桶的实现,这基本上就是您的存储桶大小。
对于堆栈,您可以使用链表,带有存储桶的链表,一个alloc'd数组(使用malloc / realloc / free),std :: vector或其他线性结构。
如果您关心代码大小,请使用std :: stack(duh)或std :: vector作为起点。但是,由于大多数C ++编译器将这些函数编译为庞大的函数集,因此您可能会使用malloc'd数组推出一个light类。
答案 2 :(得分:0)
虽然这个答案并不能准确地给出实现提示,但它回答了如何经常保护自己免受缓冲区溢出等错误的影响。 GCC有一个标志:
-fmudflap -fmudflapth -fmudflapir
对于支持它的前端(C和C ++),检测所有危险的指针/阵列解除引用操作,一些标准 库字符串/堆函数,以及一些其他与范围/有效性测试相关的构造。模块如此检测 应该不受缓冲区溢出,无效堆使用以及其他一些C / C ++编程错误的影响。仪器 - tation依赖于一个单独的运行时库(libmudflap),如果在链接中给出-fmudflap,它将链接到一个程序中 时间。已检测程序的运行时行为由MUDFLAP_OPTIONS环境变量控制。见“环境 MUDFLAP_OPTIONS = -help a.out“为其选项。
通常,这需要编译器支持,因为不能为[]
之类的本机数组或类似char[]
的指针重载下标运算符char*
。
答案 3 :(得分:0)
只是跟踪数组的大小。如果你有一个大小为10的数组,只需将该大小存储在'int'中。然后每次访问您的数组时,只需检查索引值是否小于您的大小值。这不会伤害你的'大O'时间