Проблема с памятью, не знаю почему.что (): std :: bad_alloc - PullRequest
0 голосов
/ 01 сентября 2011

Я пытаюсь написать программу, которая выводит следующую перестановку числовой строки в лексикографическом порядке, но я получаю ошибку памяти:

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

У меня никогда не было этой проблемы раньше, есть идеи? вот полная программа:

#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;

}

1 Ответ

2 голосов
/ 01 сентября 2011

Вы не возвращаете значение из Next_Permutation.Невозможность вернуть значение из любой функции, но main вызывает неопределенное поведение , где компилятор и программа могут делать все, что им нравится.Мой компилятор Solaris отказывается принимать программу, в то время как мой компилятор Linux компилирует программу, но затем происходит сбой программы, поскольку free обнаружил неверный указатель в какой-то момент.Оба являются допустимыми способами лечения чего-то, что не определено.

Когда у вас неопределенное поведение, обычно не стоит прилагать много усилий, чтобы выяснить, почему ваша программа ведет себя странно, потому что то, что вы видите, не обязательновоспроизводимый кем-либо еще, и, возможно, даже не воспроизводимый вами .Убедитесь, что у вас есть действующая программа, и затем начните отладку.Хотя вполне возможно, что у вас законно заканчивается память, более вероятно, что исключение выдается при попытке скопировать что-то, что вообще не является допустимым объектом.

Ваш компилятор, вероятно, предлагает некоторую диагностику, но вам может потребоваться запросить их при запуске.Если вы используете g ++, обязательно включите опцию -Wall, которая включает «все» предупреждения.(Есть несколько неясных, которые не включены, но вам, как правило, не нужно беспокоиться о них.)

...