标题说.
糟糕的样本:
std::vector<Point>* FindPoints()
{
std::vector<Point>* result = new std::vector<Point>();
//...
return result;
}
Run Code Online (Sandbox Code Playgroud)
如果我vector稍后删除它会有什么问题?
我主要用C#编程,所以在C++上下文中这个问题对我来说并不是很清楚.
Mat*_*lia 11
根据经验,您不这样做,因为您在堆上分配的越少,泄漏内存的风险就越小. :)
std::vector也很有用,因为它以RAII方式自动管理用于矢量的内存; 现在,通过在堆上分配它,您需要显式释放(with delete result)以避免泄漏其内存.由于例外情况,事情变得复杂,这可能会改变您的返回路径并跳过delete您放置的任何路径.(在C#中,您没有这样的问题,因为垃圾收集器会定期调用无法访问的内存)
如果要返回STL容器,可以选择以下几种:
按价值归还; 从理论上讲,由于在返回过程中产生的临时性,你应该招致复制 - result但是较新的编译器应该能够使用NRVO 1来删除副本.可能还有std::vector像许多std::string实现一样实现写时复制优化的实现,但我从未听说过.
相反,在C++ 0x编译器上,移动语义应该触发,避免任何副本.
std::auto_ptr(或std::unique_ptr在C++ 0x中),并将函数的返回类型更改为std::auto_ptr<std::vector<Point > >; 以这种方式,你的指针总是封装在一个堆栈对象中,当函数退出时(以任何方式)自动销毁,并销毁vector它仍由它拥有的if.此外,完全清楚谁拥有返回的对象.result向量成为调用者通过引用传递的参数,并填充该向量而不是返回新向量.std::copy+ std::back_inserter或其他任何内容将这些数据存储在它想要的任何容器中.看不多(代码正确可能很棘手),但值得一提.除非真的有必要,否则动态创建任何东西都是不好的做法.动态创建容器的理由很少,因此通常不是一个好主意.
编辑:通常,大多数代码只应处理容器中的迭代器(或两个),而不是担心返回容器的速度有多快.
| 归档时间: |
|
| 查看次数: |
4279 次 |
| 最近记录: |