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