【问题标题】:Is there anything wrong with assigning dynamically created objects to pointers that are private members of a class?将动态创建的对象分配给作为类的私有成员的指针有什么问题吗?
【发布时间】:2013-03-07 10:35:30
【问题描述】:

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

【问题讨论】:

  • 这些是公共成员,但智能指针使这样做更加安全。
  • 你必须小心,不要让其他人删除指针。
  • 我可以在 virual studio 2010 中使用智能指针吗?
  • @MickaelBergeronNéron,当然,Boost 有shared_ptr,如果你知道问题,总会有std::auto_ptr

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


【解决方案1】:

pWinsock 是公共成员,但无论哪种方式都没有问题。 pWinsock 和函数的指针返回值都指向动态分配的Winsock 对象。只要您在某个时候delete 对象,就不会发生内存泄漏。

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-31
      • 2018-06-10
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多