这是另一个系统生成的程序,因此它可能是重复性的,效率较低,或者应该是聪明的。它由函数第一行的段错误导致崩溃。我怀疑这可能是内存问题,但不确定根本原因。因为向量可能达到1000个元素,所以它必须是连续的。崩溃时调用堆栈“ Calculation :: getItem(9)”>“ Calculation :: getItem(8)”>“ Calculation :: getItem(7)”>“ Calculation :: getItem(6)” ...在崩溃之前崩溃返回正确的结果100。
在Calculation.cpp中
std::optional<std::any> Calculation::getItem(int rowNo)
{
if(calculatedRow[rowNo].has_value())
{
return calculatedRow[rowNo];
}
switch(rowNo)
{
case 0 : return calculatedRow[rowNo] = 0;
case 1 : return calculatedRow[rowNo] = 100;
case 2 : return calculatedRow[rowNo] = getItem(1)
case 3 : return calculatedRow[rowNo] = getItem(2)
case 4 : return calculatedRow[rowNo] = getItem(3)
case 5 : return calculatedRow[rowNo] = getItem(4);
case 6 : return calculatedRow[rowNo] = getItem(5)
case 7 : return calculatedRow[rowNo] = getItem(6);
case 8 : return calculatedRow[rowNo] = getItem(7);
case 9 : return calculatedRow[rowNo] = getItem(8);
...
}
return 0;
}
在Calculation.h
namespace Calculation
{
//private namespace
namespace
{
std::vector<std::optional<std::any>> calculatedRow(1000);
}
std::optional<std::any> getItem(int rowNo);
};
我稍微修改了您的代码并运行它。当我用非常大的数字1024 * 128 - 1
运行它时,出现错误。因此,我认为您的错误与调用堆栈限制有关。我的推论是由于您正在使用递归,您超出了调用堆栈限制和程序崩溃。我想在下面共享useful question和我的代码。
Calculation.h
#include <optional>
#include <any>
#include <vector>
namespace Calculation {
//private namespace
namespace {
std::vector<std::optional<std::any>> calculatedRow(1024 * 128);
}
std::optional<std::any> getItem(int rowNo);
};
Calculation.cpp
#include <optional>
#include <any>
#include <iostream>
#include "Calculation.h"
std::optional<std::any> Calculation::getItem(int rowNo) {
std::cout << rowNo << std::endl;
if (calculatedRow[rowNo].has_value()) {
return calculatedRow[rowNo];
}
switch (rowNo) {
case 0 :
return calculatedRow[rowNo] = 0;
case 1 :
return calculatedRow[rowNo] = 100;
}
return calculatedRow[rowNo] = getItem(rowNo - 1);
}
main.cpp
#include "Calculation.cpp"
int main() {
// auto retVal = Calculation::getItem(1);
auto retVal = Calculation::getItem(1024 * 128 - 1);
if (retVal.has_value()) {
std::printf("%d\n", std::any_cast<int>(retVal.value()));
}
return 0;
}
并且当我通过CLion运行它时,获得的日志是:
...
43776
43775
43774
43773
43772
43771
43770
43769
Process finished with exit code 11