的我有一個表指針在A型(稱爲利斯塔)容器的指針的B.一個矢量(每一個目的是具有專用屬性的容器類:std<vector> *B
)。然後,我宣佈一個指針(被稱爲具有相同類型爲C),做一個for循環通過利斯塔讓所有指針B和把他們在C.當我放棄我的計劃,我又解除分配解除分配利斯塔第一,利斯塔他們自己的指針向量B.然後我釋放指針C,但程序崩潰。解除分配指針
我有這個調試了一下,知道的釋放點什麼的時候,指針C,所以它不知道要解除什麼。
難道我做錯了嗎?或者我的問題有什麼解決方案?
對不起,我把下面
//Class A
#pragma once
#include "MyContainer.h"
class B;
class A
{
public:
A();
~A();
MyContainer<B> *pListOfB;
}
A::A()
{
pListOfB = new MyContainer<B>;
}
A::~A()
{
if(pListOfB)
{
delete pListOfB;
pListOfB = NULL;
}
}
//Class C
#pragma once
#include "MyContainer.h"
class B;
class C
{
public:
C();
~C();
MyContainer<B> *pListOfB;
void getListOfB(MyContainer<A> *pListOfA);
}
C::C()
{
pListOfB = new MyContainer<B>;
}
C::~C()
{
if(pListOfB)
{
delete pListOfB;
pListOfB = NULL;
}
}
void C::getListOfB(MyContainer<A> *pListOfA)
{
for(pListOfA->isBegin(); !pListOfA->isEnd();)
{
A *pA = pListOfA->getNext();
for(pA->isBegin(); !pA->isEnd();)
{
B* pB = pA->*pListOfB->getNext();
pListOfB->add(pB);
}
}
}
//Class MyContainer
#pragma once
#include <vector>
template <class T>
class MyContainer
{
public:
MyContainer(void);
~MyContainer(void);
T* getNext();
void removeAll();
void add(T* t);
void isBegin();
bool isEnd();
private:
std::vector<T*> items;
typename std::vector<T*>::iterator it;
};
template <class T> MyContainer<T>::~MyContainer()
{
removeAll();
}
template <class T> void MyContainer<T>::add(T *t)
{
items.push_back(t);
}
template <class T> void MyContainer<T>::removeAll()
{
while(!isEmpty())
{
std::vector<T*>::iterator tempIt =items.begin();
T* t = (*tempIt);
items.erase(tempIt);
delete t;
t=NULL;
}
}
template <class T>
T* MyContainer<T>::getNext()
{
if(isEnd() || isEmpty())
return NULL;
return (T*)(*(it++));
}
template <class T>
void MyContainer<T>::isBegin()
{
it = items.begin();
}
template <class T>
bool MyContainer<T>::isEnd()
{
return it==items.end();
}
我的代碼我了以下行動: 1.初始列表的對象myContainer中* pListOfA; 2.將B數據到在pListOfA 3.初始C對象 4.調用C對象操作getListOfB每個A對象從pListOfA獲得B數據。 5.退出程序
程序首先釋放pListOfA,然後每個A釋放它們自己的pListOfB。在該程序之後,dealloc C對象依次dealloc pListOfB屬性C.但pListOfB指向無,因爲pListOfA將每個數據解除分配。所以我的程序崩潰了。 我通過rem修復了在C類的dtor中刪除pListOfB的行,但是我在該行發現了一條警告內存泄漏。 這就是我所有的問題。請給我看看正確的方法。提前致謝。
是的,你做錯了什麼;否則你的程序不會崩潰。但是,從上面的描述中推斷出你做錯了什麼是非常困難的。我建議展示一個重現問題的最小程序。 – 2010-11-11 04:33:16
'std * B'?你確定? –
2010-11-11 04:34:31
是的,沒有代碼,像「A類型的列表指針」這樣的東西真的很混亂。 – ssube 2010-11-11 04:35:33