5

基本クラスを使用して、派生型ストアへの 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

現在発生している深刻なメモリ リークを防ぐ方法はありますか?

4

1 に答える 1

8

抽象基本クラスVariableには仮想デストラクタがないため、そのクラスへのポインターを使用して派生クラスのオブジェクトを削除することはできません。それはまさにunique_ptr<Variable>それが破壊されたときにやろうとすることです。

これにより、未定義の動作が発生します。最も可能性の高い動作は、派生クラスのデストラクタが呼び出されないため、管理するリソースがリークすることです。

最も簡単な修正は、基本クラスの仮想デストラクタです。

virtual ~Variable() {}
于 2013-08-09T17:16:30.830 に答える