我实际上对c ++很新。我试着写一个函数模板,传递参数作为参考。
这样做的时候我得到了一个std :: bad_alloc。所以我也尝试将它作为值传递,甚至通过指针传递。我总是得到一个std :: bad_alloc,但我很确定,该对象存在且地址是正确的(用调试器检查)。
我的最后一次尝试是在函数中创建对象。它是有效的,如果我使用硬编码数据,但如果我传递数据,则需要创建对象,作为函数参数。
我正在使用特定的数值模拟框架(http://www.dune-project.org/),所以我不确定,如果示例代码是有用的。我刚刚联系了框架支持,他们不知道这个问题来自哪里。
我希望有人可以帮助我或者有一个想法,如何解决这个/工作的问题!
代码示例:
template<const int dim, const int k>
int solvePoissonPDE2(int maxlevel, Dune::YaspGrid<dim>& grid)
{
/*
* Debugging Notes:
* function works, if grid, fieldvector, array AND bitset are created inside the function
* BUT NOT if grid OR the components used to create a grid are passed as reference, value or pointer parameters (SEGMENTATION FAULT)
*/
try {
/*// make grid
Dune::FieldVector<double, dim> L(1.0);
Dune::array<int, dim> N(Dune::fill_array<int, dim>(1));
std::bitset<dim> B(false);
Dune::YaspGrid<dim> grid(L, N, B, 0);*/
grid.globalRefine(maxlevel - 1);
// get view
using GV = typename Dune::YaspGrid<dim>::LeafGridView;
const GV &gv = grid.leafGridView();
const int q = 2 * k;
// make finite element map
using DF = typename GV::Grid::ctype;
using FEM = Dune::PDELab::QkLocalFiniteElementMap<GV, DF, double, k>;
FEM fem(gv);
BCTypeParam bctype;
// solve problem
using Constraints = Dune::PDELab::ConformingDirichletConstraints;
poisson_driver<GV, FEM, BCTypeParam, Constraints>(gv, fem, "poisson_yasp", bctype, false, q);
return 0;
}
catch (Dune::Exception &e){
std::cerr << "Dune reported error: " << e << std::endl;
return false;
}
catch (std::string &e){
std::cerr << "An error has been detected: " << e << std::endl;
return false;
}
catch (std::exception &e){
std::cerr << "STL reported error: " << e.what() << std::endl;
}
catch (...){
std::cerr << "Unknown exception thrown!" << std::endl;
return false;
}
}
所有使用的功能都在运行并经过测试。