2011-11-24 84 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