簡體   English   中英

指針內存泄漏的可能性?

[英]Possibility of a pointer memory leak?

我有一個用c ++編寫的基本Game類,還有一個Character類,該類將指向游戲的指針作為其構造函數的參數。 我對所有這種新奇的“ C ++”和“指針”爵士樂都還不陌生,因此,如果這似乎是一個愚蠢的問題,請多多包涵。 實際的代碼還有很多,但是出於演示目的,我將其壓縮了一些:

class Game {
  Game() { /* blah blah blah */ };
  ~Game() {};
};
class Character {
  Character(Game *game, unsigned int x, unsigned int y) {
    /* here there be dragons */
  };
  ~Character() {} // empty destructor
};

我的問題是,完成任何給定角色后,是否需要刪除指向主要Game實例的指針,還是該指針與內存泄漏完全無關? 在任何給定的時間點,我在一個游戲中都有800多個角色,因此,如果指針導致內存泄漏,那將是一個問題。

我的問題是,完成給定角色后,是否需要刪除指向主游戲實例的指針?

不必要。

應該確保所有對象都可以確保銷毀指定的Game實例,但是Character實例應該對此負責嗎?

您說會有很多角色實例。 考慮:還會有很多游戲實例嗎? 每個角色都指向他們自己的游戲對象嗎?


如果每個角色都有自己獨立的游戲,那么確實有必要為角色破壞游戲負責。 在這種情況下,使用指針可能不太有意義,因為使用直接子對象會更簡單。

但是,如果有許多角色是指同一個游戲(我懷疑是這種情況),那么一個角色就不能擁有該游戲的唯一所有權,因為一旦任何一個角色被銷毀,其他角色仍然會指向該游戲。游戲。


這是共享所有權的兩種方法

  1. 使用壽命比任何角色實例更長的游戲實例。 例如, main功能中的靜態對象或自動對象。 這樣,沒有角色對破壞負責。 棘手的部分是確保在游戲開始之前銷毀所有角色實例。

  2. 使用引用計數智能指針,例如std::shared_ptr 這樣,當最后一個角色出現時,游戲將被銷毀。

由於您是動態初始化Game對象,因此除非您明確進行初始化,否則它不會被銷毀。 所以是的,在某個時間點,如果您使用了指針和動態分配,則需要銷毀Game對象。

您可以通過以下方式對此進行測試:

#include <iostream>
class Game {
public:
    Game() 
    {
        std::cout << "Game Object Initialized\n";
    }
    ~Game()
    {
        std::cout << "Game object destroyed\n";
    }
};
class Character {
    Game *g;
public:
    Character(Game *game, unsigned int x, unsigned int y) {
        g = game;
        std::cout << "Character Object Initialized\n";
    }
    ~Character()
    {
        std::cout << "Character Object Destroyed\n";
    }
};

void main()
{
    Game *gameObj = new Game();
    Character *characterObj = new Character(gameObj, 0, 0);
    delete characterObj;

}

輸出:

游戲對象已初始化

角色對象初始化

角色對象被破壞

在這種情況下,在characterObj gameObj被銷毀后, gameObj仍然可以使用。 您可以將此對象傳遞給新的角色。 當然,需要使用delete gameObj;銷毀它delete gameObj;


如果要在釋放所有角色后自動銷毀Game對象:如其他人所述,可以改用shared_ptr對象。

#include <iostream>
#include <memory>

class Game {
public:
    Game()
    {
        std::cout << "Game Object Initialized\n";
    }
    ~Game()
    {
        std::cout << "Game object destroyed\n";
    }
};
class Character {
    std::shared_ptr<Game> g;
public:
    Character(std::shared_ptr<Game> game, unsigned int x, unsigned int y)
    {
        g = game;
        std::cout << "Character Object Initialized\n";
    }
    ~Character()
    {
        std::cout << "Character Object Destroyed\n";
    }
};

void main()
{
    //to instantiate a shared_ptr, pass pointer to game as argument in constructor
    std::shared_ptr<Game> gameObj(new Game()); 
    Character *characterObj_0 = new Character(gameObj, 0, 0);
    Character *characterObj_1 = new Character(gameObj, 0, 0);

    delete characterObj_0;
    delete characterObj_1;

    Character *characterObj_2 = new Character(gameObj, 0, 0);

    delete characterObj_2;
}

游戲對象已初始化

角色對象初始化

角色對象初始化

角色對象被破壞

角色對象被破壞

角色對象初始化

角色對象被破壞

游戲對象被破壞

暫無
暫無

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

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