Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.80
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
#1

realloc - C++

04.05.2011, 09:51. Просмотров 1920. Ответов 21
Метки нет (Все метки)

здраствуйте!

решил накатать такой класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdlib.h>
 
template <typename TYPE> 
class List
{
private:
    TYPE* buffer;
    size_t _size;
public:
    List() : buffer(NULL), _size(0) {};
    void push(const TYPE &val);
    TYPE pop();
 
 
};
 
template <typename TYPE> 
void List<TYPE>::push(const TYPE &val) {
    _size++;
    TYPE* _buffer = NULL;
    _buffer = (TYPE*) realloc(buffer, sizeof(val) * _size);
 
    if ( _buffer != NULL ) {
        buffer = _buffer;
        buffer[_size] = val;
    }
}
проблема заключается в функции push деббагер в вижуал студио пишет что неправильный указатель в _buffer выделяется, хотя написано всё почти точно так же как в cplusplus.com. Проверял при TYPE=string. В чё может бытть проблема? Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.05.2011, 09:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос realloc (C++):

realloc - C++
Доброго времени суток, есть код, в котором динамически выделяется память под массив, затем этот массив инициализируется с клавиатуры и...

realloc - C++
#include &lt;iostream&gt; using namespace std; int main() { int size=0; cout&lt;&lt;&quot;enter size array: &quot;; cin&gt;&gt;size; int...

Не выполняется realloc - C++
Вообщем, не могу понять в чем ошибка, malloc() работает, а realloc() выдает ошибки. Имеется собственный тип item (структура, в которой два...

malloc/realloc - C++
есть следующий код: mmlist=(_mathmod*)malloc(sizeof(_mathmod)); *mmlist=_mathmod(mm); int i=0; ...

Функция realloc - C++
Начнем сразу с кода. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cstdlib&gt; int main(void) { using namespace std; ...

malloc, realloc - C++
У меня задан одномерный динамический массив таким образом: int *m1=new int; //n-количество элементов, вводится пользователем Далее этот...

21
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
04.05.2011, 14:06 #16
kravam, Ну да. Не написав свой мы просто не увидим что он вызвался, несмотря на то, что если мы его используем компилятор вызовет свой созданный по умолчанию для данного класса (который выполняет побитовое копирование).
1
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
04.05.2011, 14:08  [ТС] #17
прочитал всё. Понял суть. А как же тогда быть. New и delete заменяют malloc и free а чем заменить realloc? И я правильно понял что реаллок можно использовать только для стандартных сишных типов и больше нигде? конечно можно char использовать вместо string но не хотелось бы прибегать к этому
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
04.05.2011, 14:43 #18
pito211, Вектором пользоваться. Стрингом. Нету замены реаллоку в С++. Однако если посмотреть в сторону STL в частности вектор и т.д. можно понять что замена все же есть, хоть и довольно тяжелая.

Добавлено через 26 минут
Реализация reserve в векторе в GCC 4.4.5. Почти realloc по сути.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  template<typename _Tp, typename _Alloc>
    void
    vector<_Tp, _Alloc>::
    reserve(size_type __n)
    {
      if (__n > this->max_size())
    __throw_length_error(__N("vector::reserve"));
      if (this->capacity() < __n)
    {
      const size_type __old_size = size();
      pointer __tmp = _M_allocate_and_copy(__n,
         _GLIBCXX_MAKE_MOVE_ITERATOR(this->_M_impl._M_start),
         _GLIBCXX_MAKE_MOVE_ITERATOR(this->_M_impl._M_finish));
      std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
            _M_get_Tp_allocator());
      _M_deallocate(this->_M_impl._M_start,
            this->_M_impl._M_end_of_storage
            - this->_M_impl._M_start);
      this->_M_impl._M_start = __tmp;
      this->_M_impl._M_finish = __tmp + __old_size;
      this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
    }
    }
1
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
04.05.2011, 15:10 #19
Что касается realloc, то на самом деле существует незаметная трудность, которые сопряжены с его использованием. Рискну предположить, что неопытный новичёк сделает так:

C++
1
2
3
4
5
6
7
int* p_0;
p= calloc (100, sizeof(int));
//Здесь некоторый код, после которого необходимо изменить блока, на который указывает p_0
 
int* p_1;
p_1= realloc (p_0, 200);
free (p_0);
...и будет неправ. Вопрос: почему?
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
04.05.2011, 15:33 #20
kravam, потому что при использовании realloc память может быть довыделена (указатель останется актуальным), и может быть перевыделена, и изначальный указатель станет висячим))
0
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
04.05.2011, 15:51 #21
Цитата Сообщение от pito211 Посмотреть сообщение
прочитал всё. Понял суть. А как же тогда быть. New и delete заменяют malloc и free а чем заменить realloc?
...Так просто же
http://www.cplusplus.com/reference/stl/vector/resize/
Изменяется размер последовательности и всё. И не думаешь об освобождении памяти.
0
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
04.05.2011, 18:39  [ТС] #22
если бы можно было использовать вектор, то и темы этой наверно не возникло бы?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2011, 18:39
Привет! Вот еще темы с ответами:

Функция realloc - C++
Помогите правильно записать функцию realloc /*9. Дан одномерный массив из 100 элементов, состоящий из случайных вещественных чисел в...

Malloc realloc и C++ - C++
Подскажите, в C++ 11 выделение памяти по прежнему &quot;нормально&quot; выделять с помощью malloc и изменять размер realloc ? Или это уже прошлое?...

аналог realloc() в С++ - C++
Здравствуйте. собственно вопрос:-существует ли таковой?

Альтернатива realloc ? - C++
Ищу способ динамически расширять массив объектов. В с++ использую new и delete, а перемешивать с ними сишные способы выделения памяти...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Yandex
Объявления
04.05.2011, 18:39
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru