让我们考虑这样的例子:
typedef struct {
int hours;
int minutes;
int seconds;
} Time;
Time createTime() {
Time time;
time.hours = ....
time.hours = ....
time.hours = ....
return time
}
void doSomething(){
while(true){
Time newTime = createTime();
// do something with time....
}
}
关于内存分配我几乎没有问题
createTime()
不返回NULL? #time
是一个局部变量,因此当方法超出范围时应将其销毁。 doSomething()
我多次调用createTime()
,这会造成内存泄漏吗? 答案 0 :(得分:6)
createTime
无法return NULL;
- 它会返回Time
。
函数在C和C ++中按值返回。这意味着当您编写return time;
时,会创建一个名为返回值的临时对象。这是从您返回的表达式中复制的。在C中,这是成员方式的副本,在C ++中它使用了复制构造函数。因此代码Time newTime = createTime();
的事件序列是:
time
在createTime()
内创建并填充time
time
被销毁newTime
已创建,返回值用作初始化程序。现在这原则上是很多复制和销毁,但是允许编译器对它进行优化(在C和C ++中),以便最终结果是createTime
可以直接构造time
进入newTime
的记忆空间,不需要临时值。在实践中,您可能会发现应用了各种级别的优化。
NB。在C ++ 11中,将 copy 替换为上面的 copy或move 。
答案 1 :(得分:4)
您不返回指针或引用,按值返回 ,这意味着该结构已复制。没有动态内存分配,它在编译时都由编译器处理,并且由于没有动态分配,因此不存在内存泄漏的可能性。
这有一个缺点,那就是你无法返回NULL
来表明没有任何东西可以归还。您必须始终返回有效的结构。
答案 2 :(得分:3)
通过说return time;
[与;
],您将返回值,而不是地址,并将该返回值收集到调用方的变量中。返回值只是复制到newTime
。
这完全有效。没有动态内存使用。在这种情况下没有内存泄漏。
接下来,createTime()
无法返回NULL
,因为返回类型指定为Time
类型。它必须返回类型为Time
的有效结构变量。此外,NULL
适用于指针类型。但是,如果您愿意,可以返回一个结构,其中所有成员初始化为-1
[基于您的结构定义,成员为int
]报告某些失败。