开发者

Memory issue, Not sure why. what(): std::bad_alloc

Im trying to write a program that outputs the next permutation of a numerical string in lexicographic order but i am getting a memory error:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted

I'v never had this problem before, any ideas? here is the full program:

#include<iostream>
#include<vector>

using namespace std;

vector<char> Next_Permutation(vector<char> InList);
void Reverse_Tail(vector<char>& List,int k);
vector<char> Swap(vector<char> InputList,int k, int l);
vector<char> GetInput();
int Find_K(vector<char> List);
int Find_l(vector<char> List,int k);
int Factorial(int n);

int main(){

 vector<char> Input = GetInput();//Getting initial input use 1234 for test

 int limit = Factorial(Input.size()); // finds how many permutations will be made

 vector<char>* AllPerms = new vector<char>[limit]; //AllPerms is the collection of all permutations(it is an array of vectors where each vector is a permutation)

 AllPerms[0] = Input; //setting intial permutation;

 for(int i=1;i<2;i++){


   // here is where i believe the program crashes. I've tried      test = Next_Permutation(AllPerms[i-1])       then 
   // doing        AllPerms[i] = Test          and the program runs through the first line fine but crashed on AllPerms[i] = Test?

  AllPerms[i] = (Next_Permutation(AllPerms[i-1]));

}
 for(int j=0; j < limit;j++){

  for(int i=0;i<AllPerms[j].size();i++){

     cout << AllPerms[j][i] << " " ;

}

cout << endl;

 }
 //cout << endl << "K = " << K << endl<< "l = " << l << endl<< endl;


  cout << endl<< endl;
  return 0;
}

int Factorial(int n){

  if(n==0)
    return 1;
  else
    return n*Factorial(n-1);

}

vector<char> Next_Permutation(vector<char> InList){

  int K = Find_K(InList);
  int l = Find_l(InList,K);

  vector<char> Output = Swap(InList,K,l);

  Reverse_Tail(Output,K);

}

void Reverse_Tail(vector<char>& List,int k){

  int i = k+1;

  int lim =开发者_运维百科 (List.size() - i)/2;

  int len = List.size()-1;

  while(i < (List.size() - lim -1)){

    List = Swap(List,i,len);
    len--;
    i++;

}

}

vector<char> Swap(vector<char> InputList,int k, int l){

  vector<char> OutList = InputList;

  int Temp = OutList[l];

  OutList[l] = InputList[k];

  OutList[k] = Temp;

  return OutList;

}

int Find_l(vector<char> List,int k){

  int l=List.size()-1;

  while(List[l] < List[k]){

    l--;

  }

  return l;

}

int Find_K(vector<char> List){

  int k = List.size()-2;

  while(List[k] > List[k+1]){

    k--;

  }

  if(k == List.size()-1){

    return -1;

  }

  return k;

}

vector<char> GetInput(){

vector<char> InputString;

cout << "Please input the string of symbols you would like to gain all permutations of: ";

char temp = 0 ;

while( temp != '\n' ){

cin.get(temp);

InputString.push_back(temp);

}

InputString.pop_back();

return  InputString;

}


You don't return a value from Next_Permutation. Failure to return a value from any function but main invokes undefined behavior, where the compiler and the program are free to do anything they like. My Solaris compiler refuses to accept the program, whereas my Linux compiler compiles the program, but then the program crashes because free detected an invalid pointer at some point. Both are valid ways to treat something that's undefined.

When you have undefined behavior, it's generally not wise to put much effort into figuring out exactly why your program is behaving strangely because whatever you're seeing isn't necessarily reproducible by anyone else, and possibly not even reproducible by you. Make sure you have a valid program, and then start debugging. Although it's possible that you're legitimately running out of memory, it's more likely that the exception is being thrown while trying to copy something that's not even a valid object in the first place.

Your compiler probably offers some diagnostics, but you might have to request them when you run it. If you're using g++, make sure to include the -Wall option, which enables "all" warnings. (There are a few obscure ones that aren't enabled, but you generally don't need to worry about them.)

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜