例如,假设我有一个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;?
答案 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()
析构函数中删除它。