Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
relax
Зарегистрирован: 11.03.2006 Сообщения: 5
|
Добавлено: Сб Мар 11 2006 03:29 Заголовок сообщения: Вектор векторов... CVector< CVector<int> > |
|
|
Нужно создать шаблон класса вектор без использования STL(его аналог). Вот примерный код:
Цитата: |
template <class T>
class CVector
{
friend class CMatrix;
public:
CVector() : m_nSize(0), m_Arr(0) {};
CVector(const int nSize)
{
m_nSize = nSize;
m_Arr = new T[m_nSize];
for (int i = 0; i< m_nSize; i++)
{
m_Arr[i] = (T)i;
}
}
CVector(const CVector& vec)
{
m_Arr = new T[vec.m_nSize];
m_nSize = vec.m_nSize;
for (int i = 0; i < m_nSize; i++)
{
m_Arr[i] = (T)vec[i];
}
}
~CVector()
{
delete m_Arr;
}
void InsertElem(const T& t)
{
T* tmp = m_Arr;
m_Arr = new T[m_nSize + 1];
memcpy(m_Arr, tmp, sizeof(T)* m_nSize);
m_Arr[m_nSize] = (T)t;
delete tmp;
m_nSize++;
}
int GetSize(void)
{
return m_nSize;
}
void GetSize(int size)
{
m_nSize = size
}
private:
T* m_Arr;
int m_nSize;
}; |
Так вот, при создании вектора intов CVector<int> vector1(10) всё проходит на ура, даже утечек нет. Но выделенные delete не работают для вектора векторов CVector< CVector<int> >. Не подскажете, как корректно удалять объекты CVector?
Спасибо |
|
Вернуться к началу |
|
|
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Сб Мар 11 2006 10:15 Заголовок сообщения: |
|
|
Как не работают?
А зачем такой?...
Ну в смысле, зачем изобретать велосипед? |
|
Вернуться к началу |
|
|
GoodmanSemen
Зарегистрирован: 10.06.2005 Сообщения: 9
|
Добавлено: Сб Мар 11 2006 20:40 Заголовок сообщения: |
|
|
Так ведь тут все просто! Ты же выделяешь память не под один указатель, например new T, а под массив - new T [...]! Соответственно надо удалять весь массив, тобишь delete [] m_Arr, а не просто первый элемент массива m_Arr (delete m_Arr;)! В твоем случае даже при использовании простого вектора CVector<...> будет утечка памяти так как ты удаляешь не весь массив!!!
Если надо, могу дать готовую реализацию проверенную мной стопудово! Удачи! |
|
Вернуться к началу |
|
|
relax
Зарегистрирован: 11.03.2006 Сообщения: 5
|
Добавлено: Вс Мар 12 2006 18:50 Заголовок сообщения: |
|
|
Kefir, такова постановка задачи
GoodmanSemen, delete [] m_Arr - так тоже пробывал, не выходит. К тому же, для int-ов мне нужен именно delete, в тоже время для объектов CVector, нужен delete[], пока не пойму, как это осуществить(чтоб и для того, и для того). С удовольствием твой пример посмотрю, а то в исходниках VECTOR - черт ногу сломит... |
|
Вернуться к началу |
|
|
relax
Зарегистрирован: 11.03.2006 Сообщения: 5
|
Добавлено: Пн Мар 13 2006 12:54 Заголовок сообщения: |
|
|
Нашел причину проблемы, но не знаю как её рещить:
оказалось в ф-ии InsertElem производится избыточное удаление (для delete [] tmp) - он удаляет не только сам tmp, но и объекты по тем адресам, что в нем хранятся - а это плохо, т.к. в итоговом m_Arr я получаю вектор удалённых векторов. Вопрос: как удалить только tmp, без удаления по адресам, хранящимся в нём? |
|
Вернуться к началу |
|
|
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Пн Мар 13 2006 16:02 Заголовок сообщения: |
|
|
Чувак, это не Java. Ты создал, насколько я понимаю массив объектов, а не массив ссылок, вроде так если я все правильно понимаю... Следовательно, нужно создавать массив ссылок на объекты! |
|
Вернуться к началу |
|
|
relax
Зарегистрирован: 11.03.2006 Сообщения: 5
|
Добавлено: Вт Мар 14 2006 10:53 Заголовок сообщения: |
|
|
Это массив, содержащий адреса объектов.
Так он заводится: m_Arr = new T[m_nSize + 1];
А как ты в данном случае представляешь массив ссылок? |
|
Вернуться к началу |
|
|
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Вт Мар 14 2006 14:57 Заголовок сообщения: |
|
|
Вопрос кнешно интересный, по логике массив ссылок надо создавать так:
Код: | m_Arr = new T*[m_nSize + 1]; |
Т.е. создает массив указетелей на объекты класса T...
Хотя ручаться не могу, не проверял...
Как в Java все гораздо проще... |
|
Вернуться к началу |
|
|
relax
Зарегистрирован: 11.03.2006 Сообщения: 5
|
Добавлено: Чт Мар 16 2006 12:20 Заголовок сообщения: |
|
|
Проблема в том,что m_Arr - и есть T* и преобразовать в Т** компилятор не может |
|
Вернуться к началу |
|
|
Kefir
Зарегистрирован: 16.04.2005 Сообщения: 443 Откуда: Пермь
|
Добавлено: Чт Мар 16 2006 14:48 Заголовок сообщения: |
|
|
а кто Вам мешает сделать m_Arr типа T**? |
|
Вернуться к началу |
|
|
|