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指针在特定持续时间(可能在其整个生命周期)内有效。您可以使用智能指针最好地表达您的意图。Astd::shared_ptr<Winsock>在这里是一个不错的选择,因为您的Game对象会创建Winsock并与客户端共享所有权。

于 2013-03-18T22:12:34.720 回答
3

我会避免暴露公共字段和共享这样的原始指针。您正在打破封装并使内存管理更加困难。而是使用访问器/修改器函数,就像在 Java 中一样。编译器会将这些内联。

返回Winsock*from的问题CreateWinsock在于,不再清楚谁“拥有” Winsock 对象,因为该方法类似于工厂构造函数,调用者拥有它,但您正在为其设置一个成员字段,因此主机Game对象真正拥有它。

我建议shared_ptr在公开 Winsock 对象时使用智能指针,以便控制 Winsock 的生命周期。

Winsock对象不会被自动删除,除非您从Game::~Game()析构函数中删除它。

于 2013-03-18T22:13:40.867 回答