2011-11-24 91 views
0

我有一個快速的問題,關於從類中的公共成員函數返回一個指向矢量或指針映射的指針的含義。C++從一個公共成員函數返回指針的向量/映射

這是我的代碼:

這裏是在B類

vector<A*>* ClassB::getfunction(){ 
    returns m_test; 
} 

m_test是指針類型的B類的指針的載體的私有數據成員的成員函數。這個對象將在堆上初始化,所以我需要在類的析構函數中刪除它(包括向量中的所有元素)。

我會使用如下所示的函數。

B* ex_B = new B(); 

vector<A*>* ex_ptr_vecA = new vector<A*>; 

ex_ptr_vecA = ex_B->getfunction(); 

我的問題:

因爲我有一個的內存都在堆上分配兩個對象將我需要刪除他們兩個?

該命令是否重要,以下是否正確?

B* ex_B = new B(); 

vector<A*>* ex_ptr_vecA = new vector<A*>; 

ex_ptr_vecA = ex_B->getfunction(); 

//do something with ex_ptr_vecA 
//Then I want to delete the allocate memory to the heap 

//delete class B first 
delete ex_B; 

//and then the vector 
//need to loop over vector elements and delete one at a time 
for(int i =0; i < ex_ptr_vecA; i++){ 
    delete ex_ptr_vecA->at(i); 
} 

delete ex_ptr_vecA; 

這是正確的,或者我會試圖刪除懸掛指針,因爲類B的析構函數已經取消了堆內存的分配?

回答

1
B* ex_B = new B(); 
vector<A*>* ex_ptr_vecA = new vector<A*>; 

在這裏,您分配了2個內存塊,並將這些塊的開頭的地址存儲在相應的指針變量中。一切都好。

ex_ptr_vecA = ex_B->getfunction(); 

現在你已經重新分配ex_ptr_vecA與任何地址getfunction()回報。你不再持有新的vector<A*>返回的地址,你不能再釋放它,因此你有內存泄漏。

如果你只需要指針ex_B的內部vector<A*>然後簡單地這樣說:

vector<A*>* ex_ptr_vecA = ex_B->getfunction(); 

你在你的示例代碼顯示ex_ptr_vecA指向您在ex_B類分配相同的向量的方式。如果ex_B刪除了它的析構函數中的那個內部向量,那麼delete ex_ptr_vecA;意味着你正在刪除兩次 - 這是未定義的行爲。

1

雖然我不認爲你行

ex_ptr_vecA = ex_B->getfunction(); 

編譯(您分配「指針向量」 =>「指針的指針的矢量」),你只需要兩個刪除。 B擁有在ex_ptr_vecA中返回的指針,所以它只負責銷燬它。您的代碼更正:

B::B() : m_test(new vector<A*>()) {} 
B::~B() { delete m_test; } 

B* ex_B = new B(); 
vector<A*>* ex_ptr_vecA; 
ex_ptr_vecA = ex_B->getfunction(); 
// Do something 
delete ex_B; 

你看,這個代碼的一點是,每一個新的具有在代碼,便於思考的分配和釋放同級刪除。爲了進一步簡化,請閱讀關於RAII的內容。

+0

對不起Typo。在函數中應該返回一個指針向量的指針。這仍然會給我同樣的結果嗎? – MWright

+0

@特許:是的,會的。如果m_test屬於B(閱讀:是B的成員),則只有B應刪除它。你可以使用scoped_ptr和引用來清除它。 – thiton

+0

是否意味着我只需要刪除ex_B?你能告訴我一個解決上述代碼的方法嗎? – MWright

0

分配

ex_ptr_vecA = ex_B->getfunction(); 

會導致內存泄漏,因爲存儲器由

new vector<A*> 

分配將無法訪問然後。將沒有指向該內存的指針,所以你沒有任何機會釋放它...

我建議你使用共享智能指針,那麼你可以忘記釋放分配的內存和你應該做的順序它。

+0

是我刪除ClassB後的情況,因爲classB的析構函數取消了內存分配? – MWright

+0

爲什麼新矢量分配的內存無法訪問? – MWright

+1

因爲該存儲器上的指針將被getfunction()返回的另一個指針覆蓋... – vitakot