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

Mac*_*las 2 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....
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Som*_*ude 6

您不返回指针或引用,而是按值返回这意味着该结构已被复制。没有动态内存分配,它在编译时全部由编译器处理,并且由于没有动态分配,因此没有内存泄漏的可能性。

这样做有一个缺点,那就是你不能返回NULL来表明没有什么可以返回。您必须始终返回有效的结构。


M.M*_*M.M 6

createTime不能做return NULL;- 它返回一个Time.

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

  1. time内部createTime()已创建并已填充
  2. 将创建返回值,并从中复制其值time
  3. time 被毁了
  4. newTime已创建,返回值用作初始值设定项.
  5. 返回值被破坏

现在这原则上是大量的复制和销毁,但允许编译器对其进行优化(在C和C++中),以便最终结果createTime可以time直接构建到内存空间中newTime,而不需要临时值.在实践中,您可能会发现应用了各种级别的优化.

NB.在C++ 11 中用副本替换副本在上面移动.