0

メモリ割り当ての練習をしようとしています。

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

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

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

#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

出力は次のようになるはずだと思いました:

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

お知らせ下さい

4

5 に答える 5

6

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

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

std::string示されているコードは、 、などの基本的なビルディング ブロックの恩恵を受ける可能性がありstd::vectorます。


示されているコードは、少なくとも 1 か所で未定義の動作も呼び出します。

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

配列は 0 ベースなので、function[1]範囲外アクセスです。

于 2012-04-22T18:04:24.553 に答える
4

delete[]クラスのデストラクタを呼び出す必要があります。

//Called when your class is destroyed.
automobile::~automobile()
{
   delete[] function;
}
于 2012-04-22T17:56:11.060 に答える
2
  1. delete[]forfunctionデストラクタtype内に配置する必要があります (現在は存在しないため、作成する必要があります)。 ~automobile

  2. 出力に関して: あなたの文字は配列であり、明確に定義されていません。そのようなものに使用することを検討してくださいstd::vector<string>(はるかに簡単です)。

于 2012-04-22T17:59:56.100 に答える
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]の代わりにcout'ing する必要がありfunction[1]ます。

そうは言っても、ほとんどの場合、new と delete の手動呼び出しを排除するように努める必要があります。保守性に役立ち、コード例外を安全に保つのに役立ちます。この場合、標準 C++ ライブラリによって提供されるベクトルと文字列を使用して、これを無料で取得できます。より一般的な意味では、RAII Idiomに従う必要があります。これは、C++ とメモリ管理が、勉強やキャリアの中で数年間の人生を削るのを防ぐのに役立ちます。

于 2012-04-22T18:18:31.810 に答える
1

内部 ~automobile デストラクタ。

于 2012-04-22T17:56:09.623 に答える