![](/img/trans.png)
[英]C++: What is the proper way to remove elements from a vector of object pointers without deleting the object it points to?
[英]What is the proper way to return an object from a C++ function?
我感到很困惑:
我正在寻找从C ++函数返回一个对象的正确方法,在基本的C ++中(没有库处理指针和自动释放内存)。 我想知道应该怎么做。
谢谢
那么来自<memory>
std::auto_ptr
怎么样? 或者如果C ++ 0x与std::unique_ptr
?
关于从函数返回对象的一些经验法则:
每份复印件 ,除非是
const
引用的函数 ; 你可以返回每个const
引用 const
引用返回此值 假设“没有库处理指针并自动释放内存”意味着没有按指针返回,没有boost::shared_ptr
和没有std::unique_ptr
( std::auto_ptr
无论如何都是邪恶的),你有两个选择:
按价值返回:
Foo bar(quux)
{
Foo foo;
foo.frobnicate(quux);
return foo;
}
Foo foo = bar("fred");
通过引用传递:
void bar(Foo& foo, quux)
{
foo.frobnicate(quux);
}
Foo foo;
bar(foo, "fred");
取决于对象的“语义”。 值应该由副本返回,而实体应该(或必须 ,因为它们理想地不可复制)由指针或引用返回。
应尽可能使用参考文献。 但是如果你必须返回一个指针,使用一个智能指针类,如std :: auto_ptr或boost :: shared_ptr是一个好主意,因为那时调用代码不必怀疑在完成它时释放它。
除非您需要子类型多态性,否则按值返回。 在后一种情况下,我将返回auto_ptr<T>
(C ++ 03)或unique_ptr<T>
(C ++ 0x)。
我个人更喜欢第二种选择,因为很明显用户需要分配和删除内存。
返回一个对象(但是该对象是从函数中的局部变量复制的,这会消耗内存)
优化编译器可能不会花费大量时间来创建副本。 您可能还需要实现复制构造函数和重载赋值运算符,具体取决于您的对象内容。
返回一个指针(但是你必须记住在调用代码中删除它,这很奇怪)
是的,你必须记得删除它,因为你不想考虑自动清理这个问题。
返回一个引用(但这是不可能的,因为这将是对函数的局部变量的引用,一旦函数结束就会被删除)
当您从成员函数返回此对象(* this)时,返回引用很有用。 否则,就像你提到它不可能使用。
总体而言:这取决于您上面所描述的关于何时选择的需求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.