我想我应该详细描述这个问题。
class solution{
public:
int* function(int para){
//clear ret
ret.clear();
//some lines to manipulate the ret;
//...........
return ret.data();
}
private:
std::vector<int> ret;
}
我讨厌使用像这样的指针。但设计要求使用int *作为回报。那么,这种方法会保证函数返回指针可用吗?
答案 0 :(得分:3)
// NOT: int* function(std::vector<int> vec){
int* function(std::vector<int>& vec){ // see & here
if(vec.empty()){
return nullptr; // nullptr is more meaningful for pointers
}
return vec.data();
// OR: return &vec.front();
}
// On each update of the vector&, update the pointer also
// as the memory location MAY change.
// And obviously, the vector& must outlive the pointer.
你需要一个引用&amp;。你不能像参数那样返回一个临时局部变量的有效指针。
答案 1 :(得分:1)
这里有一个普遍的问题:
int* function(std::vector<int> vec){
}
如果将向量传递给此函数,则构造本地副本仅在函数调用期间可用(就像它的作用域一样),一旦函数返回,向量就会被破坏,并且可能返回的指针因此失效。要解决这个问题,我们必须通过引用传递:
int* function(std::vector<int>& vec)
我们现在可以通过以下方式获取指针:
return vec.data();
但请注意,此函数非常无意义,因为您可以直接在向量上调用方法(data()
),而不是将其传递给函数。
答案 2 :(得分:0)
在这样的函数int* function(std::vector<int> vec)
中,您按值传递参数,因此在调用function(my_vector)
时,编译器将通过调用复制构造函数创建my_vector
的副本,此副本将仅在程序控制流程输入功能的时刻与控制流程退出功能的时刻之间生效。
所以你不能在那个上下文中返回一个指向你的向量开头的指针,因为当你退出该函数时它将不再存在。这是“返回临时”的调用,这非常糟糕,因为访问此指针时程序可能会崩溃。
要做你想做的事,你可以通过引用传递你的矢量:int* function(std::vector<int>& vec)
,然后拨打vec.data()
:
int* function(std::vector<int>& vec)
{
return vec.data();
}
但是,如果可以的话,请与std::vector
合作,不要乱用指针。