Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Вектор векторов... CVector< CVector<int> >

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
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    Заголовок сообщения: Ответить с цитатой

Как не работают?

А зачем такой?...
Ну в смысле, зачем изобретать велосипед?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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, такова постановка задачиSmile

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. Ты создал, насколько я понимаю массив объектов, а не массив ссылок, вроде так если я все правильно понимаю... Следовательно, нужно создавать массив ссылок на объекты!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
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 все гораздо проще...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
relax



Зарегистрирован: 11.03.2006
Сообщения: 5

СообщениеДобавлено: Чт Мар 16 2006 12:20    Заголовок сообщения: Ответить с цитатой

Проблема в том,что m_Arr - и есть T* и преобразовать в Т** компилятор не может
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Kefir



Зарегистрирован: 16.04.2005
Сообщения: 443
Откуда: Пермь

СообщениеДобавлено: Чт Мар 16 2006 14:48    Заголовок сообщения: Ответить с цитатой

а кто Вам мешает сделать m_Arr типа T**?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...