让我们考虑这样的例子:
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....
}
}
Run Code Online (Sandbox Code Playgroud)
关于内存分配我几乎没有问题
createTime()不返回NULL?这#time是一个局部变量,因此当方法超出范围时应该销毁它.doSomething()我createTime()多次调用内部方法,这会造成内存泄漏吗?您不返回指针或引用,而是按值返回,这意味着该结构已被复制。没有动态内存分配,它在编译时全部由编译器处理,并且由于没有动态分配,因此没有内存泄漏的可能性。
这样做有一个缺点,那就是你不能返回NULL来表明没有什么可以返回。您必须始终返回有效的结构。
createTime不能做return NULL;- 它返回一个Time.
函数在C和C++中按值返回.这意味着在编写时return time;,会创建一个名为返回值的临时对象.这是从您返回的表达式中复制的.在C中,这是成员方式的副本,在C++中它使用了复制构造函数.所以代码的事件序列Time newTime = createTime();是:
time内部createTime()已创建并已填充timetime 被毁了newTime已创建,返回值用作初始值设定项.现在这原则上是大量的复制和销毁,但允许编译器对其进行优化(在C和C++中),以便最终结果createTime可以time直接构建到内存空间中newTime,而不需要临时值.在实践中,您可能会发现应用了各种级别的优化.
NB.在C++ 11 中用副本替换副本或在上面移动.