【问题标题】:How to successfully create a function that creates an object and returns a pointer to that object?如何成功创建一个创建对象并返回指向该对象的指针的函数?
【发布时间】:2013-03-16 15:58:54
【问题描述】:

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

【问题讨论】:

    标签: c++ oop pointers reference


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

    【讨论】:

    • 是不是意味着动态创建的对象在函数结束后仍然存在,直到被删除?
    • @MickaelBergeronNéron,在决定完成并致电delete *ppMessageLog之前,它将一直可用。
    • 哇,我不知道!谢谢!
    【解决方案2】:

    当你这样写

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

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

    改为使用堆创建 MessageLog

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 2013-03-07
      相关资源
      最近更新 更多