0

使用 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 函数不会像我期望的那样做。该问题的解决方案是什么?谢谢。

4

2 回答 2

1

使用动态分配:

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:确保复制构造函数可用。

于 2013-03-16T16:01:35.460 回答
1

当你这样写

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

MessaLog 在堆栈上创建并具有功能范围,在您离开 CreateMessageLog 的那一刻它就不再存在

改为使用堆创建 MessageLog

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

不要忘记在不再需要时删除分配的堆。

于 2013-03-16T16:14:40.973 回答