使用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函数不会按照我的预期去做。这个问题的解决方案是什么?感谢。
答案 0 :(得分: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:确保复制构造函数可用。
答案 1 :(得分: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;
}
不要忘记在不再需要时删除已分配的堆。