2017-05-30 32 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! 

} 
相關問題