所有
我正在使用2D矢量将我的结果从函数返回到main。 2D向量非常大,并且该函数被执行了10K +次,因此我必须使用指针返回它来加速它。
这是我的代码:
vector<vector<double>>* someFunction()
{
vector<vector<double>> results;
//do something...
return &results;
}
并在主要:
int main()
{
// do something
////////// EDIT: vec is a pointer, I missed * at first place
vector<vector<double>>* vec = someFunction(); // vec is empty!
cout<<vec.size(); // size = 0
return;
}
当我在main中检查vec的值和大小时,结果发现vec的大小为0。
我可以知道我错了吗?
非常感谢提前。
此致
长
答案 0 :(得分:5)
您正在返回指向局部变量的指针。退出函数作用域时,此变量不再存在,使您有一个悬空指针。这是未定义的行为。
只需返回一个值:
vector<vector<double>> someFunction()
{
vector<vector<double>> results;
//do something...
return results;
}
如果您担心按价值返回涉及昂贵的副本,请记住,极有可能通过return value optimization(RVO)省略这些副本,特别是命名返回值优化(NRVO)。即使这没有发生(它是可选的,所以实现可以决定不这样做),在C ++ 11中,移动语义会起作用。移动std::vector<double>
非常便宜。
答案 1 :(得分:0)
您是否在此处返回对本地变量的引用,因此超出范围?使它成为类的成员,假设它在类
中或者将引用作为参数传递给函数
void someFunction(vector<vector<double>>& results)
{
results.clear();
//do something...
}
答案 2 :(得分:0)
你返回一个指向vector的指针。删除方法中的*:
vector<vector<double>> someFunction()
当然返回向量,而不是指向它的指针
答案 3 :(得分:0)
似乎已经有了一个流行的答案,但有一种方法可以完全按照您的要求使用动态内存分配。我觉得这值得指出,虽然它可能不是解决这一特定问题的最佳方法,但动态内存分配通常是一种非常有用的技术。我们的想法是“someFunction”应该创建一个指向动态分配的内存块的指针,该内存将保存vector<vector<double>>
。以下是使用智能指针的工作代码,但如果c ++ 11不适合您,也可以使用传统的new
和delete
关键字进行分配:
#include <memory>
#include <vector>
using namespace std;
shared_ptr<vector<vector<double>>> someFunction() {
vector<vector<double>> result;
//Do stuff with result
shared_ptr<vector<vector<double>>> resultPtr =
make_shared<vector<vector<double>>>(result);
return resultPtr;
}
int main() {
shared_ptr<vector<vector<double>>> ptr;
ptr = someFunction();
return 0;
}
就像我说它可能不是最好的方法,但是要知道返回指向本地对象的指针确实可以使用动态内存分配正确完成。