2017-05-30 36 views
0
#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! 

} 

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

+1

使用'std :: vector em()'并返回向量。 (N)RVO将删除看起来是副本的东西。 – nwp

+0

或者传递给em的引用。 –

+0

我需要从函数A创建一个向量,并在B中使用该向量。所以我尝试使用指针进行通信。 – StackQ

回答

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); 
    ... 
} 
+0

按价值返回向量不是一个好主意。 – syntagma

+0

我想使用ref的调用 – StackQ

+1

在C++ 11中,它被移动而不是被复制,因此按值返回向量没有问题。 – Eric

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

1

功能EM的变量向量v是临时的,当函数em返回时,变量向量v的生命将结束,内存将被删除。你可以传递一个引用到函数em或new中的一个指针。 如果你不想传递一个指针,你可以阅读下面的代码以供参考。

#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! 

} 
相关问题