#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!
}
我知道矢量是动态分配。 但是,当函数结束时,内存似乎被释放。 我想使用一个指针来使用在另一个函数中的函数内声明的向量。 我该怎么办?
答案 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