Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,317

    [C++] free(): double free detected in tcache 2 Aborted (core dumped)

    codice:
    #include <fstream>
    #include <string_view>
    #include <unordered_map>
    #include "nlohmann/json.hpp"
    using json = nlohmann::json;
    
    class Strategy {
    private:
        int mActionNum;
        double mNormSum;
        double* mRegretSum;
        double* mStrategy;
        double* mStrategySum;
        double* mAverageStrategy;
    
    public:
        Strategy (const int actionNum): mActionNum {actionNum} {
            mRegretSum = new double[actionNum];
            mStrategy = new double[actionNum];
            mStrategySum = new double[actionNum];
            mAverageStrategy = new double[actionNum];
    
            for (int a = 0; a < actionNum; ++a) {
                mRegretSum[a] = 0.0;
                mStrategy[a] = 1.0 / (double) actionNum;
                mStrategySum[a] = 0.0;
                mAverageStrategy[a] = 0.0;
            }
        }
    
        ~Strategy() {
            delete[] mRegretSum;
            delete[] mStrategy;
            delete[] mStrategySum;
            delete[] mAverageStrategy;
        }
    
        const double* get(const double weight) {
            mNormSum = 0.0;
    
            for (int a = 0; a < mActionNum; ++a) {
                mStrategy[a] = mRegretSum[a] > 0 ? mRegretSum[a] : 0;
                mNormSum += mStrategy[a];
            }
    
            for (int a = 0; a < mActionNum; ++a) {
                if (mNormSum > 0) {
                    mStrategy[a] /= mNormSum;
                } else {
                    mStrategy[a] = 1 / mNormSum;
                }
    
                mStrategySum[a] += weight * mStrategy[a];
            }
    
            return mStrategy;
        }
    
        const double* get_avg() {
            mNormSum = 0.0;
    
            for (int a = 0; a < mActionNum; ++a) {
                mNormSum += mStrategySum[a];
            }
    
            for (int a = 0; a < mActionNum; ++a) {
                if (mNormSum > 0) {
                    mAverageStrategy[a] = mStrategySum[a] / mNormSum;
                } else {
                    mAverageStrategy[a] = 1.0 / (double) mActionNum;
                }
            }
    
            return mAverageStrategy;
        }
    };
    
    
    int main () {
        std::ifstream f("/home/tomas/Dropbox/strategy.json");
        json data = json::parse(f);
    
        std::unordered_map<std::string_view, Strategy> strategies;
        std::string info_set {};
    
        for (auto& e : data) {
            info_set = e["cluster"].get<std::string>()
                        + ',' + e["history"].get<std::string>();
    
            Strategy strat { static_cast<int>(e["regret_sum"].size()) };
            strategies.insert({info_set, strat});
        }
        return 0;
    }

    Come risultato ho l'errore del titolo. Se commento strategies.insert({info_set, strat}); non ho errori, quindi presumo che l'oggetto strat venga distrutto alla fine dello scope del for e dia l'errore. Giusto?


    UPDATE:

    Ho provato anche a fare questo:

    codice:
    Strategy createOutOfScope(int size) {
        Strategy strat { size };
        return strat;
    }
    
    int main () {
        std::ifstream f("/home/tomas/Dropbox/strategy.json");
        json data = json::parse(f);
    
        std::unordered_map<std::string_view, Strategy> strategies;
        std::string info_set {};
    
        for (auto& e : data) {
            info_set = e["cluster"].get<std::string>()
                        + ',' + e["history"].get<std::string>();
    
            strategies.insert({info_set, createOutOfScope(static_cast<int>(e["regret_sum"].size()))});
        }
        return 0;
    }
    Ma neanche questo funziona...
    Ultima modifica di zacca94; 14-12-2022 a 03:57
    Logiqo.org gestionale per perizie infortunistiche.

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,317
    UPDATE
    Ho capito il problema non è perchè l'oggetto viene instanziato e distrutto ma perchè non viene copiato bene.
    Il problema sta in questo:
    codice:
        double* mRegretSum;
        double* mStrategy;
        double* mStrategySum;
        double* mAverageStrategy;
    Quindi ho sostuito tutti i double con vector<double> invece di fare riferimento ai puntatori.
    Logiqo.org gestionale per perizie infortunistiche.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.