从函数和内存分配中返回struct

时间:2014-12-17 07:21:02

标签: c++ c

让我们考虑这样的例子:

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

关于内存分配我几乎没有问题

  1. 为什么方法createTime()不返回NULL? #time是一个局部变量,因此当方法超出范围时应将其销毁。
  2. 内部方法doSomething()我多次调用createTime(),这会造成内存泄漏吗?

3 个答案:

答案 0 :(得分:6)

createTime无法return NULL; - 它会返回Time

函数在C和C ++中按值返回。这意味着当您编写return time;时,会创建一个名为返回值的临时对象。这是从您返回的表达式中复制的。在C中,这是成员方式的副本,在C ++中它使用了复制构造函数。因此代码Time newTime = createTime();的事件序列是:

  1. timecreateTime()内创建并填充
  2. 创建返回值,并从time
  3. 复制其值
  4. time被销毁
  5. newTime已创建,返回值用作初始化程序。
  6. 返回值已销毁
  7. 现在这原则上是很多复制和销毁,但是允许编译器对它进行优化(在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]报告某些失败。