Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不删除多态类型的唯一\u ptr_C++_Unique Ptr - Fatal编程技术网

C++ 不删除多态类型的唯一\u 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__

我有一个到使用基类的派生类型存储的唯一_ptr向量

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)中也实现了一个析构函数。非常感谢您的快速回复!!