C++ 如何修复valgrind中仍然可到达的错误?

C++ 如何修复valgrind中仍然可到达的错误?,c++,valgrind,C++,Valgrind,-----更新----- 我没有退出mid函数,而是返回main并退出那里,从而解决了这个问题 你能解释一下它为什么起作用吗 tnx 我的代码上仍然可以找到valgrind错误 已尝试: 在退出之前和函数readCSV结束之前关闭文件 声明iss一次,并使用iss.str、iss.clear (所有析构函数都是默认值) 我认为这个功能给我带来了问题。我从主函数调用,并将csv文件读入deque: static std::deque<Fractal *> readCSV(const

-----更新-----

我没有退出mid函数,而是返回main并退出那里,从而解决了这个问题

你能解释一下它为什么起作用吗

tnx


我的代码上仍然可以找到valgrind错误

已尝试:

  • 在退出之前和函数readCSV结束之前关闭文件

  • 声明iss一次,并使用iss.str、iss.clear

  • (所有析构函数都是默认值)

    我认为这个功能给我带来了问题。我从主函数调用,并将csv文件读入deque:

    static std::deque<Fractal *> readCSV(const std::string &path)
    {
        std::deque<Fractal *> fractals;
        std::ifstream ifs(path);
        if (ifs.fail())
        {
            std::cerr << INV_INPUT << std::endl;
            exit(1);
        }
        std::string line;
        while (getline(ifs, line))
        {
            std::istringstream iss(line);
            std::string arg;
            int type, height;
            getline(iss, arg, ',');
            type = strToN(arg);//parse int from string, -1 if not a valid integer
            getline(iss, arg, ',');
            height = strToN(arg);
            if (height <= 0 || height > MAX_HEIGHT)
            {
                std::cerr << INV_INPUT << std::endl;
                deleteFractalArr(fractals);
                exit(1);
            }
            if (getline(iss, arg, ','))
            {
                std::cerr << INV_INPUT << std::endl;
                deleteFractalArr(fractals);
                exit(1);
            }
    
            switch (type)
            {
                case 1:
                    fractals.push_front(new SCarpet(height));
                    break;
                case 2:
                    fractals.push_front(new SSieve(height));
                    break;
                case 3:
                    fractals.push_front(new CDust(height));
                    break;
                default:
                    std::cerr << INV_INPUT << std::endl;
                    deleteFractalArr(fractals);
                    exit(1);
            }
        }
        return fractals;
    }
    
    static std::deque readCSV(const std::string&path)
    {
    标准:德克分形;
    std::ifstream ifs(路径);
    if(ifs.fail())
    {
    
    std::cerr在您的
    deleteFractalArr
    函数中,赋值
    f=nullptr
    实际上没有任何作用。对于Valgrind错误,请首先尝试创建一个来向我们展示,并包含完整的Valgrind输出,并标记出它在示例代码中提到的行。无法访问的内存是一个错误。通常无法访问,除非它是不再被积极使用但仍被引用的内存。如果您使用--memcheck:show reachable=yes运行Valgrind,并且您有一个调试版本,那么Valgrind输出应该包括分配内存的代码行。您可以发布Valgrind输出吗?在某些系统上,可能仍然存在一些错误CHOBLE动态内存分配的OS,C运行时或C++运行库,但这似乎不是你的情况。在你的代码> DeleTeFractARRR >函数中,赋值<代码> f= nulLPTR 实际上没有做任何事情。对于ValgRAND错误,请首先尝试创建一个来显示我们,并包括完整的ValGrand输出,和M。划掉它在示例代码中提到的行。不可访问内存是一个错误。通常不可访问,除非它是不再被积极使用但仍被引用的内存。如果使用--memcheck:show Reachable=yes运行Valgrind,并且您有一个调试版本,那么Valgrind输出应该包括代码行,其中分配了内存。你可以发布你的ValGRD输出吗?在一些系统中,OS、C运行时或C++运行库可能分配一些可访问的动态内存,但这似乎不是你的情况。
    static void deleteFractalArr(const std::deque<Fractal *> &fractals)
    {
        for (Fractal *f:fractals)
        {
            delete f;
            f = nullptr;
        }
    }