簡體   English   中英

C ++從公共成員函數返回指針的向量/映射

[英]C++ returning a vector/map of pointers from a public member function

我有一個關於將指針返回到類中公共成員函數的向量或指針映射的含義的快速問題。

這是我的代碼:

這是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類的析構函數已經取消了堆內存的分配?

雖然我不認為行

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的內容。

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

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

ex_ptr_vecA = ex_B->getfunction();

現在你已經用getfunction()返回的地址重新分配了ex_ptr_vecA。 您不再保留新vector<A*>返回的地址,您不能再釋放它,因此您有內存泄漏。

如果你只需要指向ex_B的內部vector<A*> ex_B的指針,那么簡單地說:

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

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

分配

ex_ptr_vecA = ex_B->getfunction();

因為分配的內存會導致內存泄漏

new vector<A*>

將無法訪問。 將沒有指向該內存的指針,因此您沒有任何機會釋放它...

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM