C++ C++;VALGRIND未初始化值是由堆分配创建的
我有个问题。编译程序时没有任何错误,但使用valgrind时: 未初始化的值是由堆分配创建的(带new的行) 条件跳转或移动取决于未初始化的值(带删除的行) 我在论坛上搜索,但是没有找到多少对我有帮助的信息。 如果你能给我一个提示,我将不胜感激 我的节目C++ C++;VALGRIND未初始化值是由堆分配创建的,c++,heap,valgrind,C++,Heap,Valgrind,我有个问题。编译程序时没有任何错误,但使用valgrind时: 未初始化的值是由堆分配创建的(带new的行) 条件跳转或移动取决于未初始化的值(带删除的行) 我在论坛上搜索,但是没有找到多少对我有帮助的信息。 如果你能给我一个提示,我将不胜感激 我的节目 #include <cstdlib> #include <stdint.h> #include <cstdio> #include <iostream> #include <string&g
#include <cstdlib>
#include <stdint.h>
#include <cstdio>
#include <iostream>
#include <string>
#include <istream>
#include <cstring>
#include <fstream>
#include <sstream>
#include <cctype>
using namespace std;
using std::cout;
using std::endl;
int dlugosc,miejsce;
ifstream file;
class channel
{
public:
int start;
double length;
int bytespix;
int resolution;
channel(double g) : start(g),
length(0),
bytespix(0),
resolution(0)
{
}
};
int fileopen() // opens the file and returns its size
{
file.open ("0_dlc.000", ios::in|ios::binary);
if( file.good() == true )
{
cout << "Uzyskano dostep do pliku!" << endl;
}
else
{
cout<< "File cannot open" <<endl;
}
file.seekg(0, file.end);
dlugosc = file.tellg();
return dlugosc;
}
int findword(const char* slowo,int startplace)
{
int m;
int c=0;
int cur=0;
unsigned int equal=0;
char element=0;
file.seekg (startplace, file.beg);
for(m=0;m<dlugosc;m++)
{
file.get(element);
if(element==slowo[cur])
{
equal++;
cur++;
}
else
{
equal=0;
cur=0;
if(element==slowo[cur])
{
equal++;
cur++;
}
}
if(equal==strlen(slowo))
{
return m+startplace;
}
}
return 0;
}
int findvalue(const char* wartosc,int startpoint)
{
int p;
int g;
char element=0;
char* buffer = new char[9];
miejsce = findword(wartosc,startpoint); // miejsce to global variable
file.seekg (miejsce+1, file.beg);
for(p=0;(int)element<58;p++)
{
file.get(element);
if((int)element>58 || (int)element<48)
break;
else
buffer[p] = element;
}
buffer[p]='\0';
g = atoi(buffer);
delete [] buffer;
return g;
}
int main()
{
int a,h=0,channels,start=0,length=0,resolution=0,bytespix=0,m=0;
const char* slowko="Data offset: ";
dlugosc=fileopen();
channel** kanaly=0;
kanaly = new channel*[9];
miejsce=0;
for(a=0;a<9;a++)
{
kanaly[a] = new channel(4);
start = findvalue("Data offset: ",miejsce+20);
kanaly[a]->start=start;
}
for(m=0;m<9;m++)
{
delete kanaly[m];
}
delete []kanaly;
file.close();
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用std::cout;
使用std::endl;
miejsce国际酒店;
ifstream文件;
类频道
{
公众:
int启动;
双倍长度;
int字节数pix;
整数分辨率;
通道(双g):启动(g),
长度(0),
bytespix(0),
决议(0)
{
}
};
int fileopen()//打开文件并返回其大小
{
file.open(“0|dlc.000”,ios::in | ios::binary);
if(file.good()==true)
{
cout问题出在通道的构造函数中。初始化所有成员变量,问题就会消失:
class channel
{
public:
double start;
double length;
int bytespix;
int resolution;
channel(double g) : start(g),
length(0),
bytespix(0),
resolution(0)
{
}
};
@Bцћ似乎已经解决了这个问题,但为了将来的参考,学习构造a是很重要的。@djf-我做了,但没有任何更改。OP发布的代码中是否有依赖于这些未初始化值的行?或者您是否假设问题出现在我们尚未显示的代码中,并且是由于中缺少初始化而导致的<代码>频道的ctor?(不质疑这是解决方案。只是好奇,因为我在发布的代码中看不到任何问题。)@simonc您不需要使用这些值来获得valgrind警告。不,问题在于显示的代码中。他确实没有初始化这些成员变量。好的,我按照您所写的那样做了,不幸的是valgrind错误是相同的。@B我理解他没有初始化这些变量,并且同意初始化它们是正确的。不过,我怀疑这是否是错误的原因。根据我的经验,您确实必须使用变量(例如if(channel.length==0)
)才能获得该警告。Valgrind不会(不能)警告已分配、从未初始化和从未取消引用的内存。@user2455862很可能来自您未显示的代码。您能给出带有Vagrin错误的完整示例吗?