内存泄漏 - C++,如果函数返回结构,我是否需要在使用后删除该结构

memory leaks - In C++, if a function returns a struct, do I need to delete the struct after using it?

本文关键字:结构 删除 C++ 泄漏 如果 函数 内存 返回 是否      更新时间:2023-10-16
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"? 它会产生内存泄漏吗?

谢谢。

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

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

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

答案 2:不,您不需要删除一些不是用 new 创建的薄。

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

虽然,正如你自己所说,你在这里制作了很多副本,这在性能方面显然是一个坏主意。

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

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

那么对象权重是 100 字节还是 100MB 都没关系。

答案如下:

1 - 你通过值方法返回值,返回objTime;并将其放入局部变量中,因此每次它都将是一个新的本地副本"t"。

2 - 您不必担心删除变量"t">

,因为您没有通过 new 运算符"t"> 分配内存,一旦超出函数范围(局部变量范围在功能块内(,它将自动删除。

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

OBJTIME *t = new OBJTIME