2012-04-22 5 views
0

私はメモリ割り当てのためのいくつかの練習をしようとしています。割り当て後にどこでメモリを解放する必要がありますか?

以下のコードは動作していますが、2つの質問があります。

割り当て後にメモリを解放するには、delete []を使用する必要がありますか。

show()関数を使用しているときに、このコードの出力が関数であるのはなぜですか?

#include <cstdlib> 
#include <new> 
#include <iostream> 
#include <cstring> 
using namespace std; 

class automobile { 

    private: 

     char (*function)[30]; 
     char *type; 
     double speed; 

    public: 

     automobile (); 
     automobile (double , char *); 
     void speed_up (double); 
     void speed_down(double); 
     const char * get_function () const; 
     void show (); 

}; 

automobile::automobile () { 

    speed = 0; 
    function = new char [1][30]; 
    strcpy(function[1], "CD player with MP3"); 

    type = new char [4]; 
    strcpy(type, "car"); 

} 

automobile::automobile(double spd, char * fn) { 

    int sz; 

} 

void automobile::show () { 

    cout << "This is a " << type << " and it has the following functions: " << function[1] << ", and its speed is " << speed << " km/h\n"; 

} 

int main () { 

    automobile car; 

    car.show (); 

    return 0; 
} 

これが出力されます。

This is a car and it has the following functions: CDcar, and its speed is 0 km/h 

私は、出力はこのことshoud考えた:

This is a car and it has the following functions: CD player with MP3, and its speed is 0 km/h 

〜自動車デストラクタ内部

+2

なぜタイトルと質問が異なるのですか? – UmNyobe

+1

なぜ 'std :: string'、ahmadを使わないのですか? – jrok

+0

@UmNyobe質問はどこでメモリを解放しなければならないのですか?タイルは同じです。私は出力について別の質問があります。 – Jack

答えて

6

理想的にはどこもです。 newdeleteは、ほとんどのコードには適していないC++の機能です。エラーが発生しやすく、低レベルです。基本ビルディングブロックにのみ役立ちます。

コードは、std::string,std::vectorのような基本的なビルディングブロックから利益を得ることができます。


も示されているコードは、少なくとも一箇所に未定義の動作を呼び出す:

function = new char [1][30]; 
strcpy(function[1], "CD player with MP3"); 

配列は0ベースであるので、function[1]は範囲外のアクセスがあります。

+0

答えをありがとう。 – Jack

1

を教えてください。

4

クラスのデストラクタでdelete[]に電話する必要があります。

//Called when your class is destroyed. 
automobile::~automobile() 
{ 
    delete[] function; 
} 
+1

出力はどうですか? – Jack

2
  1. あなたは(あなたが現在1を持っていないので、あなたはそれを作成する必要があります)destructor~automobilefunctiontypeためdelete[]を配置する必要があります。

  2. 出力に関して:あなたのキャラクターは配列が明確に定義されていません。そのようなことには(もっと簡単に)std::vector<string>を使用することを検討してください。私は割り当てた後、メモリを解放するために、[] deleteを使用しなければならないの

2

あなたの出力は、B/C以下の誤りがあります:

speed = 0; 
function = new char [1][30]; 
strcpy(function[1], "CD player with MP3"); 

これは

speed = 0; 
function = new char [1][30]; 
strcpy(function[0], "CD player with MP3"); 

としたときに出力あなたがfunction[0]代わりのfunction[1]をcout'ingれるべきでなければなりません。

これは、ほとんどの場合、手動でnewを削除して削除するようにしてください。メンテナンス性に役立ち、コードの例外を安全に保ちます。この場合、標準のC++ライブラリによって提供されているベクトルと文字列を使用することで、これを無料で取得できます。より一般的な意味では、RAII Idiomに従ってください。これにより、C++やメモリ管理は、あなたの学業やキャリアの中で、あなたの人生を数年間削るのに役立ちます。

関連する問題