2015-06-14 112 views
1

我有問題在C++中創建動態表。 我的程序中斷長嘯:在xxx.exe處0x75914598std :: bad_alloc在內存位置(可能與創建動態表)

未處理的異常:微軟C++異常:性病:: bad_alloc的內存位置0x0107F73C。

我知道有一些我錯過了,所以如果你能如此善良,並指出我在哪裏以及如何修復它。 ll具有隨機值,(但即使我設置了一個值,就像我在下面的代碼中得到的值一樣,所以問題出現在下面的代碼中),這是在另一個函數中產生的(問題出在這個代碼上:/) 。

全碼: http://pastebin.com/Gafjd5Um

代碼:

#include <iostream> 
#include <math.h> 
#include <cstdio> 
#include <locale.h> 
#include <conio.h> 
#include <cstdlib> 
#include <time.h> 
#include <vector> 

class GeneratePass 
{ 

private: 
    //int length; 
    int ll=5; 
    char *lowertab; 

public: 
    void ChooseLenght(); 
    void CreateList(); 
    GeneratePass() 
    { 
     lowertab = new char[ll]; 
    } 
    ~GeneratePass() 
    { 
     delete[] lowertab; 
    } 
}; 

void GeneratePass::CreateList() 
{ 


    srand(time(NULL)); 
    int i, j; 

    for(i = 0; i < ll; i++) 
    { 
     lowertab[ i ] =(char)(rand() % 24) + 97; 

    } 
    for(i = 0; i < ll; i++) 
    { 
     cout << lowertab[ i ]; 

    } 
} 


int main() 
{ 
GeneratePass create; 
create.CreateList(); 

return 0; 
} 
+0

頂多大?如果它是整數範圍,那麼這很可能是該不良分配的來源。 –

+0

對不起,我忘了提及它。我編輯了我的帖子。 'll'不能大於16. – engray

+0

你能發佈你的完整代碼嗎?當我在Visual Studio 2013上自己嘗試時,我沒有收到編譯錯誤(當'll'設置爲11時我的) – user3476093

回答

0

您的完整代碼在「創建」這兩個對象時失敗。

在您的完整代碼中,您沒有初始化ll,但是您在構造函數中使用了它。如果你打算讓用戶選擇長度,你不應該在你的構造函數中創建數組。相反,你需要在choose_length函數中做到這一點。

GeneratePass() 
    { 
    lowertab = NULL; 
    ll=0; 
    } 


void GeneratePass::CreateList() 
{ 
    if(ll<1 || ll > 1024*1024*1024) throw "Invalid length"; 
    lowertab = new char[ll]; 
    .... 
    <your code here> 

} 
+0

現在我碰到了另一個問題...當選擇案例2 - 隨機生成'l'一切正常。但是,當我試圖去案例1 - 'cin'的'l'時,我得到了同樣的舊'std :: bad_alloc'。試圖修改它,但我失敗了。我的完整代碼[http://pastebin.com/xBaQ0463](http://pastebin.com/xBaQ0463) – engray

+0

哦,不要忘了添加'll;魯; LC; ld'在情況1中創建函數,一切都很好 – engray

0

看你的全碼:

在線路162和163您建造GeneratePass類的兩個不同實例。在以下第167和168行中,您可以在一個對象上調用ChooseLength,在另一個對象上調用createList

由於對象不共享任何信息,因此對象create的成員字段ll未初始化,因此可能是一些非常大的值。

因此,分配失敗並拋出std::bad_alloc

要解決此問題,您只需使用一個對象。

+0

你的意思是這樣嗎? 'GeneratePass生成; generate.ChooseLenght(); generate.CreateList();' – engray

+0

是的,正好。這樣,對象'generate'中的成員字段'll'在'ChooseLenght'中被設置,因此在'CreateList'中使用時有一個初始化值。 –

+0

我像你說的那樣使用它,可悲的是它仍然拋出相同的'std: :bad_alloc'錯誤:/ – engray

相關問題