将动态创建的对象分配给作为类的私有成员的指针有什么问题吗?

时间:2013-03-18 22:07:40

标签: c++ pointers memory-management dynamic memory-leaks

例如,假设我有一个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;

};

并且游戏中的3个指针分配如下:

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

    return pWinsock;
}

这会导致任何问题吗?另外,我会删除动态创建的对象,如下所示:delete pWinsock;?

2 个答案:

答案 0 :(得分:5)

pWinsock是公共成员,但不管怎样,这都没有错。 pWinsock和函数的指针返回值都指向动态分配的Winsock对象。只要您在某个时刻delete对象,就没有内存泄漏。

此处唯一的问题是此函数的客户端可能delete指针本身,而您的Game对象可能依赖于pWinsock指针在特定持续时间内有效(也许整个一生中)。您可以使用智能指针最好地表达您的意图。这里std::shared_ptr<Winsock>是个不错的选择,因为Game对象会创建Winsock,然后与客户共享所有权。

答案 1 :(得分:3)

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

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

我建议在暴露Winsock对象时使用像shared_ptr这样的智能指针,以便控制Winsock的生命周期。

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