什么是安全的? 从函数返回一个结构或指针
#include <iostream>
struct person_t{
int age;
};
person_t get_person1(){
person_t person;
person.age = 10;
return person;
}
person_t * get_person2(){
person_t *person = new person_t;
person->age = 20;
return person;
}
int main(){
person_t person1 = get_person1();
person_t *person2 = get_person2();
std::cout << person1.age << std::endl;
std::cout << person2->age << std::endl;
delete person2;
return 0;
}
我想知道从函数返回结构的最安全的方法。
就像在这里和这里的问题的答案一样,据说当你在get_person1()
创建一个对象时,那个对象在超出作用域后将被销毁。
但是,当我搜索“如何从函数c ++返回结构”时,它向我建议方法一(使用get_person1()
)(这里是示例)。 但是我认为这个方法会在函数被调用后破坏对象,我认为方法2是最安全的。
我在这里错了吗?? 或有关此主题的任何意见..?
谢谢!!
使用价值回报有三个原因:
据说当你在get_person1()
创建一个对象时,该对象在超出作用域后将被销毁。
什么是破坏是本地对象(即: person
里面get_persion1()
返回的是该对象的副本:复制一个struct person_t
(它也可以被移动)。 所以,这是安全的。
get_person2()
也是安全的,但考虑使用智能指针而不是原始指针:
std::unique_ptr<person_t> get_person2(){
auto person = std::make_unique<person_t>();
// For pre-C++14
// std::unique_ptr<person_t> person(new person_t);
person->age = 20;
return person;
}
这样, get_person2()
的调用者不必调用delete
(它可能会忘记这么做)。
两种方法都是同样安全的 - 既不会导致未定义的行为,也可以通过函数内的值设置回调用方。
主要区别在于第一种方法复制struct
,而第二种方法将指针复制到struct
。 当struct
很小时,比如在你的例子中,没有什么区别。 当struct
变大时,返回一个指针可能会节省一些CPU周期,但会增加额外的内存分配,所以它远不是一个有保证的胜利。
显然,第二种方法的另一个缺点是最终必须delete
struct
。 第一种方法没有这个要求。
上一篇: What is safe? returning a structure or the pointer from a function