【发布时间】:2020-02-20 16:54:08
【问题描述】:
如果我将一个系统与 boosts odeint 模块集成在一起,使用一个类来定义派生类,那么这个类的析构函数会被非常频繁地调用。
- 这种行为是有意的吗?
- 为什么会这样?
- 如果我想在这个类中动态分配数组怎么办?
例如这段代码:
#include <iostream>
#include <boost/numeric/odeint.hpp>
using namespace std;
using namespace boost::numeric::odeint;
class foo
{
public:
virtual ~foo() {
std::cout << "destructor called" << std::endl;
}
void operator()(const double &x, double &dxdt, double t) const {
dxdt = 1;
}
};
int main( int argc , char **argv )
{
double x = 0;
const double dt = 0.1;
typedef runge_kutta4< double > stepper_type;
integrate_const( stepper_type() , foo(), x , 0.0 , 10.0 , dt);
return 0;
}
调用析构函数大约 400 次。 (我是 C++ 初学者)
【问题讨论】:
-
@Someprogrammerdude 不,
integrate_const是一个模板函数(在 boost 1.71.0 中)。 -
查看文档显示
integrate_const是一个带有模板参数System [=foo]的函数。该参数被复制多次——实际上在每个迭代步骤中复制了 4 次,因为它是 100 次迭代的经典龙格-库塔方法。如果您必须在foo中存储一些额外的数据,我建议您使用指针语义围绕该数据构建一个瘦包装器。 -
@Albjenow 那将是一个很好的答案。
-
你的问题很好!!!如果在这里有同样的效果,但直到你的问题我才意识到。