我有一个使用基类
的派生类型商店的unique_ptrs向量std::unique_ptr<std::vector<std::unique_ptr<Variable>>> decisionVariables;
其中Variable是超类,派生类型是Route类。我的问题是,当删除包含decisionVariables的类时,路由实例似乎没有被删除。
路线来自变量:
#ifndef __VARIABLE__
#define __VARIABLE__
/**
* Interface for decision variables.
*/
#include <cstring>
#include <ostream>
#include <memory>
class Variable {
public:
/**
* Returns an independent copy of this decision variable.
*
* @ret a copy of this decision variable
*/
virtual std::unique_ptr<Variable> copy () = 0;
virtual std::string toString () = 0;
};
#endif
路由的头文件:
#ifndef __ROUTE__
#define __ROUTE__
#include <vector>
#include <map>
#include <cstring>
#include <sstream>
#include <ostream>
#include <memory>
#include <set>
#include <algorithm>
#include "../../../Framework/h/core/Variable.h"
class Route : public Variable {
private:
std::unique_ptr<std::vector<int>> route;
double frequency;
double routeLength;
public:
Route ();
void add (int);
void addToFront (int);
void remove ();
void removeFromFront ();
std::vector<int>::iterator begin();
std::vector<int>::iterator end();
int size ();
std::vector<int> getViableNodes (std::shared_ptr<std::map<int, std::unique_ptr<std::vector<int>>>>, int);
int front ();
int back ();
std::string toString ();
int get (int);
bool containsLink (int, int);
bool contains (int);
void replace (int, int);
void setFrequency (double);
double getFrequency ();
void setRouteLength (double);
double getRouteLength ();
std::unique_ptr<Variable> copy ();
};
#endif
有没有办法防止此刻遭受严重的内存泄漏?
答案 0 :(得分:7)
您的抽象基类Variable
没有虚拟析构函数,因此您无法使用指向该类的指针删除派生类的对象。这正是unique_ptr<Variable>
在销毁时会尝试做的事情。
这将导致未定义的行为 - 最可能的行为是派生类的析构函数未被调用,因此它管理的任何资源都将泄漏。
最简单的修复是基类中的虚拟析构函数:
virtual ~Variable() {}