0

たとえば、Game クラスがあるとします。

class Game{
public:
    Game();
    ~Game();

    void CreateWindowClass(HINSTANCE);
    void CreateRessources(HINSTANCE);

    void ShowMainScreen();

    Winsock* CreateWinsock();

    MessageLog* CreateMessageLog();

    D2DResources* CreateD2DResources(HWND);

    HWND Getm_hWnd();

public:
    D2DResources* pD2DResources;
    Winsock* pWinsock;
    MessageLog* pMessageLog;

private:
    HWND m_hWnd;

};

Game 内の 3 つのポインターは次のように割り当てられます。

Winsock* Game::CreateWinsock()
{
    pWinsock = new Winsock;

    return pWinsock;
}

これは何か問題を引き起こしますか?また、次のように動的に作成されたオブジェクトを削除しますか? delete pWinsock;?

4

2 に答える 2

5

pWinsockパブリックメンバーですが、どちらにしてもこれで問題はありません。pWinsock関数のポインター戻り値と両方が、動的に割り当てられたWinsockオブジェクトを指しています。ある時点でオブジェクトを取得している限りdelete、メモリ リークは発生しません。

ここでの唯一の問題は、この関数のクライアントがdeleteポインター自体である可能性がある一方で、オブジェクトが特定の期間 (おそらくその存続期間全体) の間有効でGameあるポインターに依存している可能性があることです。pWinsockスマート ポインターを使用すると、意図を最もよく表すことができます。オブジェクトが を作成し、所有権をクライアントと共有するためstd::shared_ptr<Winsock>、ここではAを選択することをお勧めします。GameWinsock

于 2013-03-18T22:12:34.720 に答える
3

パブリック フィールドを公開したり、そのような生のポインターを共有したりすることは避けます。カプセル化を破り、メモリ管理をより困難にしています。代わりに、Java のように、アクセサー/ミューテーター関数を使用してください。コンパイラはこれらをインライン化します。

Winsock*fromを返す際の問題はCreateWinsock、メソッドがファクトリ コンストラクターに似ており、呼び出し元がそれを所有しているため、誰が Winsock オブジェクトを "所有" しているかが明確でないことですが、メンバー フィールドをそれに設定しているため、ホストGameオブジェクトは実際にそれを所有しています。

shared_ptrWinsock オブジェクトを公開するときのようにスマート ポインターを使用して、Winsock の有効期間を制御することをお勧めします。

デストラクタ内からオブジェクトを削除しない限り、Winsockオブジェクトは自動的に削除されません。Game::~Game()

于 2013-03-18T22:13:40.867 に答える