2016-06-25 22 views
-3

私は請求書とその番号(識別子)を作成しようとしています。その番号は自動的に生成され、9文字です。私はコメントのようにメモリを解放しようとすると、私はエラーを取得するC++メモリの割り当てを解除する必要がありますか?

#include <iostream> 
using namespace std; 

int counter = 1234; 
char * BillNumber() 
{ 
    if (counter == 1) 
    { 
     counter++; 
     return "000000001"; 
    } 

    int n = 0, c = counter; 

    while (c != 0) 
    { 
     n++; 
     c /= 10; 
    } 

    char * nrBill = new char[n + 1]; 
    _itoa_s(counter, nrBill, n + 1, 10); 
    nrBill[n + 1] = '\0'; 

    int difference = 9 - n; 
    if (difference == 0) 
     return nrBill; 

    char * helper = new char[difference + 1]; 
    for (int i = 0; i < difference + 1; i++) 
    { 
     helper[i] = '0'; 
     if (i == difference) 
      helper[i] = '\0'; 
    } 

    strcat_s(helper, 10, nrBill); 
    counter++; 
    return helper; 
} 

int main() 
{ 
    char * bill[10]; 

    for (int i = 0; i < 10; i++) 
    { 
     bill[i] = BillNumber(); 
    } 

    for (int i = 0; i < 10; i++) 
    { 
     cout << bill[i] << endl; 
    } 

    //Deallocation 
    /*for (int i = 0; i < 10; i++) 
    { 
     delete[] bill[i]; 
    }*/ 
    return 0; 
} 

は、ここに私のコードです。私はなぜそれを得るのか理解している、私はmain機能で私の記憶を割り当てていないことを意味します。だから私は実際には関数BillNumberでそれを割り当て解除する必要があります。しかし、私はそれが機能の中で必要とは思わない。

だから私の質問は次のとおりです。

はここで実際に必要なメモリの割り当て解除ですか?

に:私は私がそれについて文句をしないでください、C++コーディング標準を使用していないことを知っています*

+3

コードにはバグがたくさんあります。これは外観にもかかわらず、デバッグサービスではありません。 – juanchopanza

+6

なぜメモリの割り当てを解除する必要はないと思いますか? 'new'でメモリを割り当てる時はいつでも' delete'でメモリを解放しなければなりません。ルールは非常に簡単です。あなたはRAIIと標準のC++のイディオムを使って簡単にすることができますが、それらを避ける何らかの理由があるようです。 –

+0

@CodyGrayよく、私は関数 'BillNumber()'で 'nrBill'の割り当てを解除する必要があることを知っていますが、どうすれば' helper'の割り当てを解除できますか?私は次のようなことはできません: 'delete [] helper; return helper; ' – Kapobajza

答えて

1

あなたはこのchar * nrBill = new char[n + 1];と、このchar * helper = new char[difference + 1];をやっているので、あなたが実際にヒープにメモリを割り当てています。あなたが明示的にそれを呼んでいない限り、それは解放されません。関数から戻る前に

delete []nrBill; 
delete []helper[]; 

と呼び出す必要があります。そうでない場合は、メモリリークが発生します。オブジェクトnrBillとヘルパーは、すぐに終了し、メモリが復元されるため、プログラムの最後まで解放されることはありませんが、メモリリークを生成するアプリケーションを開発すると長い間働いていると、本当の問題になるでしょう。

+0

私は '[] nrBill'を削除する必要があることを知っていますが、もし私が' 'delete [] helper''を実行すると、どのように返されますか?私は空のcharポインタを返すことはできません。 – Kapobajza

+0

delete []ヘルパーはあなたのメイン関数で呼び出されるべきです、ごめんなさい!名前をつけて、削除[]請求書のようにそれを与えます。 – meJustAndrew

0

helperを返すとまず第一に、nrBillの割り当てを解除しません。それはメモリリークと問題です。

手動でメモリを割り当てたので、メモリの割り当て解除が必要です。しかし、あなたのケースでは、プログラムが終了し(メインリターン)、割り当てられたすべてのメモリがとにかく解放されるため、メモリリークは発生しません(前述のように)。

2

私は主機能に自分のメモリを割り当てていないことを意味します。だから私は実際に関数BillNumberでそれを割り当て解除する必要があります。しかし、私はそれが機能の中で必要とは思わない。

割り当てが行われた場所は問題ではありませんが、何かを割り当てた場合、割り当てを解除する必要があります。あなたのコードでは、main()で呼び出されたBillNumber()の後にポインタを使用しているので、後でmain()に割り当てを解除する必要があります。

コメントのようにメモリの割り当てを解除しようとすると、エラーが発生します。あなたは本当の問題を見つけるためのプログラムをデバッグする必要がある

、ここでは可能性の一つだ:

char * nrBill = new char[n + 1]; 
_itoa_s(counter, nrBill, n + 1, 10); 
nrBill[n + 1] = '\0'; 

nrBill[n + 1]は、配列の境界の外になっています。

関連する問題