4

このオブジェクトを適切に作成/破棄していることを確認したい...

これは、Vector オブジェクトへの参照を含む Camera オブジェクトの定義です。

#ifndef CAMERA_H
#define CAMERA_H

#include "vector.h"

class Camera {
 private:
  Vector* location;
  Vector* direction;
  float velocity;
 public:
  Camera();
  ~Camera();
};

#endif

コンストラクターで作成されます。

#include "camera.h"

Camera::Camera() {
  location = new Vector(1.0, 1.0, 1.0);
  direction = new Vector(1.0, 1.0, 1.0);
  velocity = 0.0;
}

Camera::~Camera() {
  delete location;
  delete direction;
}

その後、カメラ オブジェクトが必要なときはいつでも を呼び出すだけCamera cameraです。

  • camera変数がスコープ外になると、デストラクタが呼び出され、メモリ リークが発生しないと仮定して正しいですか?

  • cameraスコープが閉じる前に変数を削除したい場合、実行するのは正しいdelete cameraですか?

4

3 に答える 3

2

可変カメラがスコープ外になると、デストラクタが呼び出され、メモリリークが発生しないと想定して正しいですか?

はい

スコープが閉じる前に可変カメラを削除したい場合、カメラの削除を実行するのは正しいですか?

いいえ、カメラはオペレーターによって割り当てられていません。カメラをnew削除することはできません。スコープから外れるまでそのままにしておきます。new/deleteオブジェクトの期間を強制するために呼び出されない限り。

潜在的なメモリリーク:

以下のコードでは、メモリがリークする可能性があります。コンストラクトlocationが終了してもdirection = new Vector(1.0, 1.0, 1.0);失敗して例外がスローされた場合、カメラデストラクタは呼び出されないため、locationメモリがリークされます。

Camera::Camera() {
  location = new Vector(1.0, 1.0, 1.0);
  direction = new Vector(1.0, 1.0, 1.0);
  velocity = 0.0;
}

より良い解決策: Vectorメンバーにポインターを導入する必要はありません。自動ストレージを使用することをお勧めします。

class Camera {
 private:
  Vector location;
  Vector direction;
  float velocity;

 public:
  Camera() 
  : location(1.0, 1.0, 1.0), 
    direction(1.0, 1.0, 1.0),
    velocity(0.0f)
  {
  }
};
于 2013-01-20T07:14:26.447 に答える
2

はいとはい(提供Cameraされた通話によって作成されましたnew)。ただし、3つのルールに
も従う必要があります。

また、動的に割り当てられたメンバーが本当に必要かどうかを再考することをお勧めしますか?
動的メモリで生ポインタを使用することにより、間違いやすいクラスのメモリ管理を明示的に行う責任があることに注意してください。ポインタではなくインスタンスを使用する方がはるかに優れています。

  Vector location;
  Vector direction;

ポインターを使用する必要がある場合は、少なくとも生のポインター メンバーの代わりにスマート ポインターを使用してください。

于 2013-01-20T07:10:44.047 に答える
1

あなたの当面の質問に答えるために、はい、デストラクタが解雇されます、そしてはい、あなたは記憶がきれいになります。ただし、誤ったコピー、このオブジェクトタイプの割り当て、および仮想破壊に対する保護は提供されていません。これにより、将来的に重大な問題が発生する可能性があります。これについての詳細は、三つのルールと、SOに関する主題に関する多くの投稿を読むことで見つけることができます。

動的割り当てが必要な場合(そしておそらく必要ない場合)を除いて、代わりに次のようにします。

class Camera 
{
private:
    Vector location;
    Vector direction;
    float velocity;
public:
    Camera();
};

Camera::Camera() 
    : location(1.0, 1.0, 1.0)
    , direction(1.0, 1.0, 1.0)
    , velocity(0.0)
{
}

デストラクタは必要ありません。

于 2013-01-20T07:14:52.777 に答える