关于Vector作为函数的返回值,有几点需要说明:
1.首先如果Vector是一个局部的变量,那么返回该Vector的引用是十分危险的,因为在Vector超出作用域的,会自动调用相关的析构函数(~Vector()),如果Vector中存放的是类(ClassName)对象的指针,则不会调用相关的类ClassName析构函数,只会把相关的空间清空(也就是Vector.size()=0),这样会造成内存泄露。但是如果Vector中存放的是类(ClassName)的对象,则会调用相关的类ClassName析构函数。所以如果Vector是一个局部的变量,那么返回该Vector的引用是十分危险的,因为该Vector已经被析构。
例子:
2.返回引用的时候需要注意,不能将函数声明成 const,否则编译不通过
例如:
std::vector<className *> & GetVec() const;//声明
std::vector<className *> & className1::GetVec() const//ERROR
{ 。。。
}
//编译错误
const std::vector<className *> & GetVec() const;//声明,这样就可以了,也就是必须返回的是const的引用,才行,当然也可以两头都不用const!
2.如果不是局部变量,可以返回引用或者该Vector的迭代器(Iterator)
1.首先如果Vector是一个局部的变量,那么返回该Vector的引用是十分危险的,因为在Vector超出作用域的,会自动调用相关的析构函数(~Vector()),如果Vector中存放的是类(ClassName)对象的指针,则不会调用相关的类ClassName析构函数,只会把相关的空间清空(也就是Vector.size()=0),这样会造成内存泄露。但是如果Vector中存放的是类(ClassName)的对象,则会调用相关的类ClassName析构函数。所以如果Vector是一个局部的变量,那么返回该Vector的引用是十分危险的,因为该Vector已经被析构。
例子:
|
例如:
std::vector<className *> & GetVec() const;//声明
std::vector<className *> & className1::GetVec() const//ERROR
{ 。。。
}
//编译错误
![](http://blogimg.chinaunix.net/blog/upfile2/090408204711.gif)
2.如果不是局部变量,可以返回引用或者该Vector的迭代器(Iterator)