簡體   English   中英

如何在C ++中將對象存儲在另一個對象中?

[英]How do I store objects within another object in C++?

我想確保我正確地創建/銷毀這個對象......

這是我的Camera對象的定義,其中包含對Vector對象的引用:

#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是否正確?

是和是( 提供Camera是通過調用new創建的 )。
但你也需要遵守三規則

另外,如果你真的需要動態分配的成員,重新思考是個好主意嗎?
請記住,通過使用帶有動態內存的原始指針,您將負責顯式為您的類執行內存管理,這很容易出錯。您只需使用實例而不是指針就好了:

  Vector location;
  Vector direction;

如果必須使用指針至少使用智能指針而不是原始指針成員。

我是否正確假設當變量相機超出范圍時,析構函數將被調用,我不會遭受任何內存泄漏?

如果我想在示波器關閉之前移除可變相機,執行刪除相機是否正確?

不,相機不是由new操作員分配的,你不能刪除它,只要離開它直到它超出范圍。 除非調用new/delete來強制對象持續時間。

潛在的內存泄漏:

在下面的代碼中,有可能泄漏內存。 如果構造location完成但direction = new Vector(1.0, 1.0, 1.0); 失敗並拋出異常,不會調用Camera析構函數,因此會泄漏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)
  {
  }
};

要回答你的直接問題,是的,析構函數將被解雇,是的,你的記憶將被清除。 但是,您沒有為不正確的復制,分配此對象類型和虛擬銷毀提供保護,這可能會導致重大問題。 這個更多細節可以通過閱讀起來發現三者的規則和很多很多的職位上,使拍攝對象。

除非你需要動態分配(而你可能不需要),否則就這樣做:

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)
{
}

不需要析構函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM