C++ 从函数和内存分配返回struct 让我们考虑这样的例子: 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.... } }
我对内存分配有一些问题C++ 从函数和内存分配返回struct 让我们考虑这样的例子: 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.... } },c++,c,C++,C,我对内存分配有一些问题 为什么方法createTime()不返回NULL?#time是一个局部变量,因此当方法超出范围时,它应该被销毁 在方法doSomething()中,我多次调用createTime(),这会导致内存泄漏吗 您不返回指针或引用,而是按值返回,这意味着结构已被复制。没有动态内存分配,编译时由编译器处理,因为没有动态分配,所以没有内存泄漏的机会 这有一个缺点,那就是您不能返回NULL来表示没有要返回的内容。您必须始终返回有效的结构。通过说返回时间[使用;]返回的是值,而不是地址,
createTime()
不返回NULL?#time
是一个局部变量,因此当方法超出范围时,它应该被销毁李>
doSomething()
中,我多次调用createTime()
,这会导致内存泄漏吗李>
您不返回指针或引用,而是按值返回,这意味着结构已被复制。没有动态内存分配,编译时由编译器处理,因为没有动态分配,所以没有内存泄漏的机会
这有一个缺点,那就是您不能返回
NULL
来表示没有要返回的内容。您必须始终返回有效的结构。通过说返回时间
[使用;
]返回的是值,而不是地址,并将返回值收集到调用者的变量中。返回值只需复制到newTime
这是完全正确的。没有动态内存使用。在此上下文中没有内存泄漏
接下来,
createTime()
无法返回NULL
,因为返回类型被指定为Time
类型。它必须返回类型为Time
的有效结构变量。此外,NULL
适用于指针类型。但是,如果愿意,您可以返回一个所有成员都初始化为-1
[根据您的结构定义,成员是int
]的结构,以报告一些故障。createTime
无法执行返回NULL代码>-它返回一个时间
函数在C和C++中按值返回。这意味着当您编写
返回时间时代码>,创建了一个名为返回值的临时对象。这是从返回的表达式复制的。在C中,这是成员智能复制,在C++中使用复制构造函数。因此,代码的事件序列Time newTime=createTime()代码>是:
创建并填充createTime()
内部的time
将创建返回值,并将其值从time
时间
被销毁
创建newTime
,返回值用作初始值设定项
返回值被销毁
现在原则上这是大量的复制和破坏,但是编译器可以优化它(在C和C++中),这样最终的结果是createTime
可以直接将time
构造到newTime
的内存空间中,而不需要临时性。在实践中,您可能会发现应用了不同级别的优化
注意。在C++11中,用上面的copy或move替换copy。我认为for struct访问说明符默认为全局。