C++ 在C++;,如果函数返回一个结构,我是否需要在使用该结构后删除它?

C++ 在C++;,如果函数返回一个结构,我是否需要在使用该结构后删除它?,c++,memory-leaks,struct,C++,Memory Leaks,Struct,我的问题是: 如果另一个类调用returnObjTime()函数,例如: OBJTIME t=objectP->returnObjTime() 我假设将创建OBJTIME结构的新副本 完成后是否需要删除变量“t”?它会造成内存泄漏吗 谢谢。否,您返回的是全局对象时间的副本,副本和全局都有基于其作用域的持续时间,这意味着当其作用域结束时,它们将自动从内存中释放。是副本,但它不是由new创建的,因此,您不需要删除它。您没有动态分配它,您不需要手动删除它。所以不,这里不会有泄漏 虽然,正如您自己所说,

我的问题是:

  • 如果另一个类调用returnObjTime()函数,例如:

    OBJTIME t=objectP->returnObjTime()
    我假设将创建OBJTIME结构的新副本

  • 完成后是否需要删除变量“t”?它会造成内存泄漏吗


  • 谢谢。

    否,您返回的是全局
    对象时间的副本,副本和全局都有基于其作用域的持续时间,这意味着当其作用域结束时,它们将自动从内存中释放。

    是副本,但它不是由
    new
    创建的,因此,您不需要
    删除它。

    您没有
    动态分配它,您不需要手动
    删除它。所以不,这里不会有泄漏

    虽然,正如您自己所说,您在这里复制了很多副本,但从性能角度来看,这显然是个坏主意

    如果希望返回对象的只读副本,可以执行以下操作:

    typedef typedef struct _OBJTIME {
        WORD wYear;
        WORD wMonth;
        WORD wDayOfWeek;
        WORD wDay;
        WORD wHour;
        WORD wMinute;
        WORD wSecond;
        WORD wMilliseconds;
    } OBJTIME
    
    OBJTIME objTime; //Note, this objTime is modified other function
    OBJTIME ObjectParent::returnObjTime() const
    {
        return objTime;
    }
    

    那么,对象的权重是100字节还是100字节并不重要。

    回答1:是的,将根据调用函数的范围创建一个具有生存期的新副本

    回答2:不需要,您不需要删除未使用new创建的内容。

    答案如下:

    1-您通过按值返回方法返回值,返回对象时间并将其放入局部变量,因此每次它都将是一个新的局部副本“t”

    2-您不必担心删除变量“t”
    ,因为您没有通过新操作符为“t”分配内存,一旦您超出函数范围(局部变量范围在函数块内),它将自动删除

    只有在执行以下操作时才需要删除:

    const OBJTIME&
    ObjectParent::returnObjTime() const
    {
        return objTime;
    }
    

    如果您或您调用的函数未调用
    new
    ,您没有理由调用
    delete
    。两个typedef?这是某种黑魔法吗?C++。为什么要定义一个结构呢?复制并不总是对性能有害的。例如,复制一个小结构几次可能比动态分配快。我引用的是返回值,他可以返回一个常量指针或常量引用。@ClementRey除非他动态分配或更改函数以传递一个输出参数,否则他不会。你是什么意思?他可以引用非动态分配的对象。。?我添加了一些代码,事情应该更清楚。代码中的每个对象都是本地的,副本和全局都有作用域持续时间。@LukeB:虽然正确,但从答案中不容易看出这一点。你应该编辑措辞,使其更清楚,两者都有作用域/自动持续时间,这很好。只是“which has”可以指副本或全局,但不能同时指两者。
    OBJTIME *t = new OBJTIME