0

全部

我正在使用 2D 向量将结果从函数返回到 main。二维向量非常大,函数执行了 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。

我可以知道我错了吗?

提前谢谢了。

问候

4

4 回答 4

6

您正在返回一个指向局部变量的指针。退出函数作用域时,此变量将不复存在,留下一个悬空指针。这是未定义的行为

只需返回一个值:

vector<vector<double>> someFunction()
{
    vector<vector<double>> results;
    //do something...
    return results;
}

如果您担心按值返回所涉及的昂贵副本,请记住,通过返回值优化(RVO),特别是称为返回值优化 (NRVO),这些副本极有可能被忽略。即使这没有发生(它是可选的,因此实现可以决定不这样做),在 C++11 中移动语义也会起作用。移动 anstd::vector<double>非常便宜。

于 2013-08-07T11:25:55.033 回答
0

您是否没有在这里返回对局部变量的引用,因此超出了范围?假设它在一个类中,让它成为类的成员

或者将引用作为参数传递给函数

void someFunction(vector<vector<double>>& results)
{
    results.clear();

    //do something...
}    
于 2013-08-07T11:26:25.790 回答
0

你返回一个指向向量的指针。删除方法中的 *:

vector<vector<double>> someFunction()

当然返回向量,而不是指向它的指针

于 2013-08-07T11:27:07.150 回答
0

似乎已经有一个流行的答案,但是有一种方法可以使用动态内存分配来完全满足您的要求。我觉得这是值得指出的,因为虽然它可能不是解决这个特定问题的最佳方法,但动态内存分配通常是一种非常有用的技术。这个想法是“someFunction”应该创建一个指向动态分配的内存的指针,该内存将保存vector<vector<double>>. 这是使用智能指针的工作代码,但如果您不喜欢 c++11,也可以使用传统的newdelete 关键字进行分配:

#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;
}

就像我说的那样,这可能不是最好的方法,但是让我们知道返回指向本地对象的指针确实可以使用动态内存分配正确完成。

于 2013-08-07T14:38:51.243 回答