gpt4 book ai didi

c++ - 具有多态类型的 unique_ptr 未被删除

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:29:43 25 4
gpt4 key购买 nike

我有一个使用基类派生类型存储的 unique_ptr vector

std::unique_ptr<std::vector<std::unique_ptr<Variable>>> decisionVariables;

其中 Variable 是父类(super class),派生类型是 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

有没有办法防止目前遇到的严重内存泄漏?

最佳答案

你的抽象基类 Variable没有虚拟析构函数,因此您不能使用指向该类的指针删除派生类的对象。这正是unique_ptr<Variable>当它被销毁时会尝试做。

这将导致未定义的行为 - 最可能的行为是未调用派生类的析构函数,因此它管理的任何资源都将泄漏。

最简单的修复是基类中的虚拟析构函数:

virtual ~Variable() {}

关于c++ - 具有多态类型的 unique_ptr 未被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18152072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com