Memory management Cplex C++;接口。如何清理内存? 背景:> IBM ILOG CPLEX的C++接口分配和分配内存相当不寻常:

Memory management Cplex C++;接口。如何清理内存? 背景:> IBM ILOG CPLEX的C++接口分配和分配内存相当不寻常:,memory-management,memory-leaks,cplex,Memory Management,Memory Leaks,Cplex,国际劳工组织环境声明ilonev环境,然后在此环境中构建模型和解算器,然后所有这些对象(包括环境)都超出范围会导致内存泄漏。请注意,我没有使用new操作符。避免这种情况的一种方法是调用environment.end()在对象超出范围之前 设置:现在,我有一个类,其目的是解决特定的ILP。此类有一些成员变量: IloEnv ilpEnvironment_; IloObjective ilpObjective_; IloExpr ilpExpression_; IloModel ilpModel_;

国际劳工组织环境声明
ilonev环境,然后在此环境中构建模型和解算器,然后所有这些对象(包括环境)都超出范围会导致内存泄漏。请注意,我没有使用
new
操作符。避免这种情况的一种方法是调用
environment.end()在对象超出范围之前

设置:现在,我有一个类,其目的是解决特定的ILP。此类有一些成员变量:

IloEnv ilpEnvironment_;
IloObjective ilpObjective_;
IloExpr ilpExpression_;
IloModel ilpModel_;
IloCplex ilpSolver_;
IloNumArray ilpSolution_;
IloNumVarArray ilpVariables_;
IloNumArray ilpStartValues_;
IloRangeArray constraints_; 
这些成员变量在构造函数的初始值设定项列表中初始化:

inline MyClass::MyClass() 
:   ilpEnvironment_(),
    ilpObjective_(ilpEnvironment_),
    ilpExpression_(ilpEnvironment_),
    ilpModel_(ilpEnvironment_),
    ilpSolver_(ilpModel_),
    ilpSolution_(ilpEnvironment_),
    ilpVariables_(ilpEnvironment_),
    ilpStartValues_(ilpEnvironment_),
    constraints_(ilpEnvironment_)
{ /* ... */ }
析构函数取消分配所有内存(已由对成员变量进行操作的类的成员函数分配):

问题:如何实现成员函数
void clear()
,该函数取消分配内存并将类恢复到初始状态?以下是我做的两次相当幼稚的尝试,但都没有成功:

inline void MyClass::clear() {
    ilpEnvironment_.end();
    ilpEnvironment_ = IloEnv(); // does not work, whether or not I comment this line out
    ilpObjective_ = IloObjective(ilpEnvironment_);
    ilpExpression_ = IloExpr(ilpEnvironment_);
    ilpModel_ = IloModel(ilpEnvironment_);
    ilpSolver_ = IloCplex(ilpEnvironment_);
    ilpSolution_ = IloNumArray(ilpEnvironment_);
    ilpVariables_ = IloNumVarArray(ilpEnvironment_);
    ilpStartValues_ = IloNumArray(ilpEnvironment_);
    constraints_ = IloRangeArray(ilpEnvironment_);
}

如果该类的目的是求解特定的ILP模型,那么我将使用模型大小/参数初始化该类,并在solve()成员函数中创建和销毁CPLEX对象,同时仅将结果保存为类成员。类成员将是模型参数,对象将隐藏所有CPLEX交易

您甚至可以有一个类成员来跟踪在特定solve()调用中要激活的约束

如果您必须使用CPLEX对象作为可变类成员,那么您可能希望尝试使用对象指针作为类成员,而不是对象本身。调用IloEnv::end()会破坏与其关联的对象,因此可以调用IloEnd::end(),然后将指针重新分配给新对象

inline void MyClass::clear() {
    ilpEnvironment_.end();
    ilpEnvironment_ = IloEnv(); // does not work, whether or not I comment this line out
    ilpObjective_ = IloObjective(ilpEnvironment_);
    ilpExpression_ = IloExpr(ilpEnvironment_);
    ilpModel_ = IloModel(ilpEnvironment_);
    ilpSolver_ = IloCplex(ilpEnvironment_);
    ilpSolution_ = IloNumArray(ilpEnvironment_);
    ilpVariables_ = IloNumVarArray(ilpEnvironment_);
    ilpStartValues_ = IloNumArray(ilpEnvironment_);
    constraints_ = IloRangeArray(ilpEnvironment_);
}