使用Direct2d时存在以下功能:

HRESULT WINAPI D2D1CreateFactory(
  _In_      D2D1_FACTORY_TYPE factoryType,
  _In_      REFIID riid,
  _In_opt_  const D2D1_FACTORY_OPTIONS *pFactoryOptions,
  _Out_     void **ppIFactory
);


当上述方法返回时,ppIFactory包含指向新工厂的指针的地址,因此可以使用该工厂。

我想做类似的事情,所以我在MessageLog.h中这样做:

void CreateMessageLog(MessageLog**);

class MessageLog{
public:
    void PutToLog(WCHAR[]);

    WCHAR* GetLog();
    int GetLogLenght();
    int GetnLogLines();

private:
    WCHAR logHistory[MaxLogSize];
    int nLogLines;
};


并将其放入MessageLog.cpp中:

void CreateMessageLog(MessageLog** ppMessageLog)
{
    MessageLog mLog;
    MessageLog* pmLog=&mLog;
    ppMessageLog=&pmLog;
}


现在完成了,我有几个问题。首先,一旦CreateMessageLog函数结束,创建的MessageLog对象将超出范围,指针将变为NULL,对吗?该问题有什么解决方案?

顺便说一句,我猜我的CreateMessageLog函数不会执行我期望的功能。这个问题也有什么解决方案?谢谢。

最佳答案

使用动态分配:

MessageLog* CreateMessageLog()
{
    return new MessageLog;
}


外部记住delete函数内new创建的指针。
您将可以在所有需要的时间访问指针所指向的内存。完成后,您必须通过调用delete a手动释放内存:

例:

MessageLog* a = createMessageLog();
// use `a` the way you want
// when done:
delete a;


如果MessageLog对象不是很大,也可以创建一个副本。即使效率较低,您也不必自己管理内存:

MessageLog CreateMessageLog()
{
    MessageLog a;
    return a;
}


PS:确保复制构造函数可用。

10-08 13:34