我读过按函数从值返回结构是完全安全的。
Is it safe to return a struct in C or C++?
如果将多个结构作为向量返回,它仍然是安全的吗?
e.g。
std::vector<mystruct> func(int c, int d){
mystruct retval;
retval.a = c;
retval.b = d;
std::vector<mystruct> structList;
structList.push_back(retval);
// create more structs and add them to list
..
return structList;
}
为什么?是否只对原始人安全,例如数字,因为不需要分配内存?
答案 0 :(得分:4)
只要mystruct
类被正确编写,这是安全的,这意味着它支持复制构造和赋值和/或移动,以及使用隐含值语义进行适当的破坏。
换句话说:“返回一个向量”这件事并不困难,它确保你在任何有效状态下有一个T t1;
,然后你可以说T t2(t1);
和/或T t3; t3 = t1;
和/或让任何T
超出范围/ delete
d并且不会发生任何不良或意外情况。如果您的T
适用于这些情况,那么在vector<T>
中使用它的一切都很好,即使是从函数返回值也是如此。
但哪种结构对此安全? mystruct
可以复制/移动构造/赋值和销毁,如果它小心地只使非static
数据成员成为以下类型之一,并且任何基类都做类似的事情:
简单数据类型,例如int
,double
,bool
等。
具有价值语义的自我管理类型,无论您是自己编写还是由标准库或其他库提供 - 例如std::string
,std::map
,std::vector
,std::list
等。这些知道如何正确复制/移动自己
此类型的数组
std::shared_ptr
您实际想要共享所有权的数据,或std::unique_ptr<>
数据可以移动但不能复制
引用,如果对象的副本有意义引用同一个地方
其成员和基类满足上述条件的其他struct
和/或class
个
但 不是原始指针 (除非某些故意共享的数据的生命周期大于对象,例如static const
变量或字符串文字):for new
/ new[]
- 对象用于管理生命周期的数据,您需要编写自己的复制构造函数和/或移动构造函数,复制赋值和/或移动赋值运算符和析构函数。使用std::shared_ptr<>
或std::unique_ptr<>
代替通常会更容易也更好。