C++ 不删除多态类型的唯一\u ptr
我有一个到使用基类的派生类型存储的唯一_ptr向量C++ 不删除多态类型的唯一\u ptr,c++,unique-ptr,C++,Unique Ptr,我有一个到使用基类的派生类型存储的唯一_ptr向量 std::unique_ptr<std::vector<std::unique_ptr<Variable>>> decisionVariables; std::唯一的决策变量; 其中变量是超类,派生类型是路由类。我的问题是,当包含decisionVariables的类被删除时,路由实例似乎没有被删除 路由是从变量派生的: #ifndef __VARIABLE__ #define __VARIABLE__
std::unique_ptr<std::vector<std::unique_ptr<Variable>>> decisionVariables;
std::唯一的决策变量;
其中变量是超类,派生类型是路由类。我的问题是,当包含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\uu变量__
#定义变量__
/**
*决策变量的接口。
*/
#包括
#包括
#包括
类变量{
公众:
/**
*返回此决策变量的独立副本。
*
*@ret此决策变量的副本
*/
虚拟std::unique_ptr copy()=0;
虚拟std::string toString()=0;
};
#恩迪夫
路由的头文件:
#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
\ifndef\uu路线__
#定义路径__
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括“../../../Framework/h/core/Variable.h”
类路由:公共变量{
私人:
std::唯一的ptr路线;
双频;
双路由长度;
公众:
路线();
无效添加(int);
void addToFront(int);
无效删除();
void removeFromFront();
std::vector::迭代器begin();
std::vector::迭代器end();
int size();
std::vector getviaplenodes(std::shared_ptr,int);
int-front();
int back();
std::string-toString();
int-get(int);
布尔容器链接(int,int);
布尔包含(int);
无效替换(int,int);
无效设置频率(双倍);
双重频率();
无效设置路由长度(双);
双getRouteLength();
std::unique_ptr copy();
};
#恩迪夫
有什么方法可以防止目前发生的严重内存泄漏?您的抽象基类
变量
没有虚拟析构函数,因此无法使用指向该类的指针删除派生类的对象。这正是unique\u ptr
在它被销毁时所要做的
这将导致未定义的行为-最可能的行为是未调用派生类的析构函数,因此它管理的任何资源都将泄漏
最简单的修复方法是基类中的虚拟析构函数:
virtual ~Variable() {}
带有双下划线的名称是保留的。不要使用它们。你不缺少一个虚拟析构函数吗?我在其他文章中看到了这个解决方案,但在派生类(Route)中也实现了一个析构函数。非常感谢您的快速回复!!