Reputation: 29
I was coding about ullman algorithm and when I run my program I faced with : "Invalid allocation size: 4294967295 byte" error. it could be about vector? or anything else? could any help me about this?
void ullman(Graph &graph,Pattern pattern,int **p,int k)
{
bool flg=true;
if(k>=pattern.vertexNum)
{
int **tmp;
tmp=new int *[pattern.vertexNum];
for(int i=0;i<pattern.vertexNum;i++)
tmp[i]=new int [graph.vertexNum];
for(int i=0;i<pattern.vertexNum;i++)
for(int j=0;j<graph.vertexNum;j++)
tmp[i][j]=p[i][j];
graph.permutation.push_back(tmp);
return;
}
for(int i=0;i<graph.vertexNum;i++)
{
for(int j=0;j<pattern.vertexNum;j++)
if(p[j][i])
flg=false;
if(!flg)
{
flg=true;
continue;
}
p[k][i]=1;
if(examin(graph,pattern,p,k))
ullman(graph,pattern,p,k+1);
p[k][i]=0;
}
return;}
bool examin(Graph &graph,Pattern pattern,int **p,int k)
{
bool flg=true;
int **pt;
pt=new int *[graph.vertexNum];
for(int i=0;i<graph.vertexNum;i++)
pt[i]=new int [pattern.vertexNum];
for(int i=0;i<pattern.vertexNum;i++)
for(int j=0;j<graph.vertexNum;j++)
pt[j][i]=p[i][j];
char **tmp; // P*graph
char **tmp2; // tmp*pt
tmp= new char *[pattern.vertexNum];
for(int i=0;i<pattern.vertexNum;i++)
tmp[i]=new char[graph.vertexNum];
for(int i=0;i<pattern.vertexNum;i++)
for(int j=0;j<graph.vertexNum;j++)
tmp[i][j]='-';
tmp2=new char *[pattern.vertexNum];
for(int i=0;i<pattern.vertexNum;i++)
tmp2[i]=new char[pattern.vertexNum];
for(int i=0;i<pattern.vertexNum;i++)
for(int j=0;j<pattern.vertexNum;j++)
tmp2[i][j]='-';
for(int j=0;j<pattern.vertexNum;j++)
for(int i=0;i<graph.vertexNum;i++)
if(p[j][i])
for(int m=0;m<graph.vertexNum;m++)
tmp[j][m]=graph.G[i][m];
for(int m=0;m<pattern.vertexNum;m++)
for(int i=0;i<graph.vertexNum;i++)
if(pt[i][m])
for(int j=0;j<pattern.vertexNum;j++)
tmp2[j][m]=tmp[j][i];
for(int i=0;i<pattern.vertexNum;i++)
{
for(int j=0;j<pattern.vertexNum;j++)
if(pattern.P[i][j]!='-' && tmp2[i][j]!='-')
if(pattern.P[i][j] != tmp2[i][j])
{
flg=false;
break;
}
if(!flg)
break;
}
if(flg)
return true;
else
return false;}
Upvotes: 1
Views: 584
Reputation: 726929
It looks like you are passing -1
for the size, because 4294967295
corresponds to 0xFFFFFFFF
, i.e. the negative one in two's complement representation.
Since the only value that you pass to new [...]
is vertexNum
, that's the value that you need to check. Add a condition at the top of your functions to see if graph.vertexNum
or pattern.vertexNum
is negative, set a breakpoint inside the conditional, and see what part of your code is making the invalid call:
void ullman(Graph &graph,Pattern pattern,int **p,int k) {
if(pattern.vertexNum < 0) {
cerr << "pattern.vertexNum is negative" << endl; // Set brekpoint here
}
bool flg=true;
... // The rest of your code
}
Upvotes: 2