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