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

时间:2013-01-02 15:52:05

标签: c++ memory-leaks struct

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

我的问题是:

  1. 如果另一个类调用returnObjTime()函数,比如说:

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

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

  3. 感谢。

5 个答案:

答案 0 :(得分:6)

不,你要返回全局objTime的副本,副本和全局都有基于其范围的持续时间,这意味着当它们的范围结束时它们将自动从内存中释放。

答案 1 :(得分:5)

这是副本是,但它不是由new创建的,所以您不需要delete它。

答案 2 :(得分:4)

答案1:是的,将根据调用该函数的范围创建一个具有生命周期的新副本。

答案2:不,你不需要删除你没有使用new创建的东西。

答案 3 :(得分:3)

你没有dynamically allocate它,你不需要手动delete它。所以不,这里不会有泄漏。

虽然,正如你自己所说,你在这里制作了大量的副本,但这显然是一个糟糕的表现。

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

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

然后,对象的权重为100bytes或100Mbytes并不重要。

答案 4 :(得分:2)

答案如下:

1 - 您通过按值返回返回objTime; 并将其转换为局部变量返回值,因此每次它都是新的本地副本“T”。

2 - 您无需担心删除变量“t”,因为您没有通过新运营商为“t”分配内存,一旦您将自动删除它将超出函数的范围(局部变量范围在功能块中)。

删除仅在您执行以下操作时才需要:

OBJTIME *t = new OBJTIME