如何成功创建一个创建对象并返回指向该对象的指针的函数?

时间:2013-03-16 15:58:54

标签: c++ oop pointers reference

使用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函数不会按照我的预期去做。这个问题的解决方案是什么?感谢。

2 个答案:

答案 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;
}

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