1

こんにちは、テンプレートを使用してマルチコンテナを作成していますが、子クラスのデストラクタからセグメンテーション違反が発生しています。コードは次のとおりです。

#include <algorithm>
#include <map>
#include <iostream>
class BaseType{
public:
    virtual ~BaseType(){}
    virtual BaseType * clone() const =0;
};

template<typename T>
class DataType : public BaseType
{
public:
    DataType(const T & aValueData = T()):mValue(aValueData) {
       // new DataType<T>(*this)
    }
    ~DataType(){

    }
    BaseType * clone() const
    {
        return new DataType<T>(*this);
    }

    T mValue;
};

    class MValueData
    {
    public:
        template<typename T>
        MValueData(T const  & aAnyValue = T()):mTypeData(0),isDelete(false)
        {
            std::cout<<"Object Address before create object: "<<mTypeData<<std::endl;
            mTypeData=new DataType<T>(aAnyValue);
            std::cout<<"Object Address after create object"<<mTypeData<<std::endl;
        }
        ~MValueData(){
            std::cout<<"Object Address "<<mTypeData<<std::endl;

            delete mTypeData;
            mTypeData=0;


        }
        MValueData()
        {
           mTypeData=0;
        }
        template<typename T>
        MValueData(const MValueData & aCopy)
        {

            mTypeData= new  DataType<T>();
           *mTypeData=aCopy.mTypeData;
        }
        template<typename T>
        const MValueData & operator=(const MValueData & aCopy)
        {
             mTypeData= new  DataType<T>();
             *mTypeData=aCopy.mTypeData;
            //MValueData(aCopia).swap(*this);
        }
         void swap(MValueData& other) {
             std::swap(this->mTypeData, other.mTypeData);
         }

         template <typename T>
         T& get()
         {
                return dynamic_cast<DataType<T>&>(*this->mTypeData).mValue;
         }

         bool operator <(const MValueData &rhs) const {
             return (mTypeData<rhs.mTypeData);
         }
         template<typename T>
         void setValue(T const & anyValue=T())
         {
             mTypeData= new DataType<T>(anyValue);
         }
         BaseType *mTypeData;
    private:

         bool isDelete;
    };

    int main()
    {
        MValueData aAnyType_1(0.22);
        aAnyType_1.get<double>();
        MValueData aAnyType_2(false);
        std::map<MValueData , MValueData&> mMapa;
        mMapa.insert(std::pair<MValueData  , MValueData&>(aAnyType_1,aAnyType_2));
//        mMapa.find(aAnyType_1);
        return 0;
    }

バグを特定するために GDB を使用していますが、適切な修正方法がわかりません。次の行にコメントすると、セグメンテーションが停止します。

 ~MValueData(){
         //   if(mTypeData)    delete mTypeData;
        }

その後、適切に実行されますが、メモリリークが発生しているようです。Updated:std::map は、挿入するオブジェクトのコピーを作成します。オブジェクトは 2 回破棄されます。1 つはメイン関数を終了するとき、もう 1 つは std::map がそれ自体を破棄するときです。事前にt​​hx!

4

3 に答える 3

1

コピー コンストラクターが正しくありません。

オブジェクトではなくポインタのみをコピーします。

コピー コンストラクターでコピーされた 2 つのオブジェクトは、デストラクターで同じオブジェクトを削除しようとします。

于 2013-09-23T17:41:55.120 に答える