2017-12-03 104 views
-3

每當我運行構造函數錢的註釋部分程序崩潰。 當我編譯它時,它也不會拋出任何錯誤。 有人能告訴我發生了什麼事嗎?每當我運行註釋代碼時程序崩潰

另外我想在這裏實現自動售貨機的問題。 我已經刪除了一些正常工作的代碼部分。

#include <iostream> 
using namespace std; 
class money 
{ 
    public : 

    int *max; 
    int *accepted_values = new int[10]; 
    bool present; 
    int *deposited; 
    int i; 
    money() 
     { 
     } 
    money(int *a, int how_many) 
     { 
      //*max = how_many; 
      // for (i=0; i<how_many; i++) 
      //  { 
      //   accepted_values[i] = a[i]; 
      //  } 
      //*deposited = 0; 
      present = false;     
     } 
}; 

class Vending_machine 
{ 
    public : 

    money *coins = new money(accepted_coins, 5); 
    //money *coins = new money(); 

    int *amount_deposited = new int; 

    Vending_machine() 
    { 
     cout<<"Cool"; 
    } 
    ~Vending_machine() 
     { 
      delete amount_deposited; 
     } 
}; 

int main() 
{ 
    Vending_machine a; 
} 
+2

['using namespace std ;' is bad practice](https://stackoverflow.com/q/1452721/2176813),請勿使用它。 – tambre

+1

無法用GCC 6.3重現。請告訴我們您的編譯器和編譯器版本。也就是說,如果你的編譯器遇到一個ICE,我們可以做的事情就不多了,除了推薦你更新你的編譯器,或者通過適當的渠道將它作爲一個錯誤進行存檔。 – tambre

+1

顯示它如何崩潰。發佈編譯器錯誤消息會很有幫助。 – ks1322

回答

0

您提領該INT指針在構造函數int *maxint *deposited,不先分配適當的內存地址。

由於它是未定義的行爲,它總是會崩潰。

int* myPointer; 
*myPointer = 10; // crashes 

指針總是先指向一個有效地址,然後才能使用它。 這可能是另一個變量的地址:

int myInt; 
int *myPointer = &myInt; 
*myPointer = 10; // doesn't crash - myInt now is 10. 

,或者它可以動態分配和釋放。

int* myPointer = new int; 

但是在這種情況下,您必須注意一旦完成後釋放內存。

delete myPointer; 

更好的解決方案是使用std::unique_ptr<>,這需要解除對破壞其指針的照顧。

但是最好的解決方案是根本不使用指針,如果它們不是真的需要的話 - 尤其是如果你不知道指針如何工作的話。我假設你可以完全避免使用指針。

+0

您能否顯示一個避免指針的快速示例? –

+0

@ user2328447謝謝,我剛剛意識到我忘了聲明使用新的int。 新的C++編程。 –

+0

當然:)我記得這個我自己...指針並不是一個真正的初學者的主題,雖然很多初學者嘗試使用它們並失敗(包括我;) – user2328447

相關問題