什么是安全的? 从函数返回一个结构或指针

#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是最安全的。

我在这里错了吗?? 或有关此主题的任何意见..?

谢谢!!


使用价值回报有三个原因:

  • 它使你的代码可读
  • 你的结构体很小(一个int),所以它就像返回一个int。 你可以用C ++来做到这一点,它很有效率
  • 在C ++ 17中(以及之前的大多数编译器),将避免该对象的中间副本的成本。 它被称为RVO。 你只需要在你的get_person函数中输入一个返回值。

  • 据说当你在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 。 第一种方法没有这个要求。

    链接地址: http://www.djcxy.com/p/96537.html

    上一篇: What is safe? returning a structure or the pointer from a function

    下一篇: Difference of variable initialization in C++