使用在另一个函数中的函数内声明的向量

时间:2017-05-30 10:40:06

标签: c++ memory vector

#include <iostream>
#include <vector>

using namespace std;

void em(vector<int>* pv );

int main()
{
    vector<int>* pv = NULL;
    em(pv);
    printf("%d %d", (*pv)[0], (*pv)[1]); // Error!

}

void em(vector<int>* pv)
{
    vector<int> V;
    pv = &V;

    V.push_back(1);
    V.push_back(2);
    printf("%d %d\n", V[0], V[1]);
    // 1 2  OK!

}

我知道矢量是动态分配。 但是,当函数结束时,内存似乎被释放。 我想使用一个指针来使用在另一个函数中的函数内声明的向量。 我该怎么办?

4 个答案:

答案 0 :(得分:2)

您可以在函数中返回一个向量。在C ++ 11中,它移动值而不是复制它们,因此按值返回并不是一个问题。

int main()
{
    vector<int> pv = em();
    printf("%d %d", pv[0], pv[1]);
}

vector<int> em()
{
    vector<int> V;
    ...
    return V;
}

或者参考

int main()
{
    vector<int> pv;
    em(pv);
    printf("%d %d", pv[0], pv[1]);
}

void em(vector<int> &V)
{
    V.push(1);
    V.push(2);
    ...
}

答案 1 :(得分:1)

函数em的变量向量v是临时的,当函数em返回时,变量向量v的生命将结束,内存将被删除。您可以在em中传递对函数em或新指针的引用。 如果您不想传递指针,可以阅读以下代码以供参考。

#include <iostream>
#include <vector>
#include <cstdio>

using namespace std;

void em(vector<int>*& pv );

int main()
{
    vector<int>* pv = NULL;
    em(pv);
    printf("%d %d", (*pv)[0], (*pv)[1]); 
    delete pv;
    pv = NULL;

}

void em(vector<int>*& pv)
{
    vector<int>* V = new vector<int>;
    pv = V;

    V->push_back(1);
    V->push_back(2);
    printf("%d %d\n", V->at(0), V->at(1));
    // 1 2  OK!

}

答案 2 :(得分:0)

在堆栈上创建的变量只与函数一样长。当em返回时,向量后面的内存被释放。

为了拥有一个持续时间更长的函数,你需要返回一个完整的对象,或者从堆中分配向量。

vector<int> em()
{
    vector<int> V;
    pv = &V;

    V.push_back(1);
    V.push_back(2);
    printf("%d %d\n", V[0], V[1]);
    // 1 2  OK!
   return V;
}

void em(vector<int>* pv)
{
   pv = new vector<int>();
   vector<int> & V =*pv;
   V.push_back(1);
   V.push_back(2);
   printf("%d %d\n", V[0], V[1]);
// 1 2  OK!
 // main needs to delete pv
}

答案 3 :(得分:0)

#include <iostream>
#include <vector>

using namespace std;

vector<int>* em( );
void P(vector<int>*);

int main()
{
    vector<int>* pv = NULL;
    pv = em();

    printf("Second : %d %d\n", (*pv)[0], (*pv)[1]); 

    P(pv);

}

vector<int>* em()
{
    //vector<int> V;
    vector<int>* pV = new vector < int > ;


    (*pV).push_back(1);
    (*pV).push_back(2);
    printf("First: %d %d\n", (*pV)[0], (*pV)[1]);
    // 1 2  OK!
    return pV;

}

void P(vector<int>* pv)
{
    printf("Third : %d %d \n", (*pv)[0], (*pv)[1]);
}

这很有效。

------- ------结果

第一名:1 2

第二:1 2

第三名:1 2