2011-09-01 88 views
0

我试着写一个程序,在输出字典顺序数字字符串的下一个排列,但我得到一个内存错误:内存问题,不知道为什么。什么()的std :: bad_alloc的

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; 

} 
+3

当新失败时会抛出'std :: bad_alloc'。我会看看什么'limit'设置为。使用阶乘作为数组限制可以非常快地耗尽内存。 –

+1

1.修复代码缩进。 2.附加一个调试器并查看异常来自哪里。 –

+0

为了清楚起见,我会用矢量替换'vector *',花了我一些时间才意识到这不是一个错字/错误。 –

回答

2

你不会从Next_Permutation返回一个值。未能从任何函数返回值,但main调用未定义的行为,其中编译器和程序可以自由地执行任何他们喜欢的操作。我的Solaris编译器拒绝接受该程序,而我的Linux编译器编译该程序,但程序崩溃,因为free在某个点检测到无效指针。两种都是有效的方式来处理未定义的东西。

如果您有未定义的行为,通常不太明智的做法是花大力气调查出您的程序行为奇怪的原因,因为您看到的任何内容都不一定可以被其他人重现,甚至可能不会被重现你。确保你有一个有效的程序,然后然后开始调试。尽管您可能合法地用完了内存,但更有可能在尝试复制一些甚至不是有效对象的东西时抛出异常。

您的编译器可能提供了一些诊断功能,但运行它时可能需要请求它们。如果您使用的是g ++,请确保包含启用“全部”警告的-Wall选项。 (有几个模糊的没有启用,但你通常不需要担心它们。)

相关问题