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

Ошибка при резервировании памяти для своего(!) вектора - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ошибка в функции http://www.cyberforum.ru/cpp-beginners/thread1494202.html
Здорова! Есть код функции: //глобальная функция которая будет возвращать интерфейс BOOL GetClassObject(const int nClsid,const int nIid,void** ppvObj) { cout <<"ppvObj="<<&(*ppvObj)<<"\r\n"; ...
C++ Бинарное дерево Помогите исправить ошибку, компилятор ругается на 110 строку, не пойму почему( #include <iostream> #include <cstdlib> #include <cstdio> #include<fstream> #include <string> using namespace std;... http://www.cyberforum.ru/cpp-beginners/thread1494195.html
C++ Может кто-то перевести этот код из паскаля в с++
Есть код на Pascal. Может ли кто-то перевести? const n = 200; function O (s : string) : boolean; var i,l : integer; c : char; r : boolean;
C++ Присвоить каждому значению массива значение индекса
доброго времени суток. проблема - перебираем массив и присваиваем каждому значению массива значение индекса, но при отображении билибирда какая то. результат в картинке. #include <string>...
C++ Отсортируйте в массиве положительные элементы по возрастанию, отрицательные – по убыванию http://www.cyberforum.ru/cpp-beginners/thread1494134.html
Задание: Отсортируйте в массиве положительные элементы по возрастанию, отрицательные – по убыванию. Использовать три метода сортировки. в конце нужно сделать примерно так: массив: -2, 0, 5, -4, 6,...
C++ Графика + консоль. Как? Вечер добрый! Подскажите как в С++ сделать графическое меню, с фоновой картинкой и прочими плюшками. А при нажатии на кнопку "Играть" вызывалась консольная игрушка (морской бой). Сама игрушка уже... подробнее

Показать сообщение отдельно
Gr1f0nn
240 / 160 / 74
Регистрация: 30.09.2012
Сообщений: 685

Ошибка при резервировании памяти для своего(!) вектора - C++

06.07.2015, 21:53. Просмотров 254. Ответов 11
Метки (Все метки)

Всем здравствуйте!
Возможно, из названия темы не совсем понятен вопрос, поэтому уточню саму суть:
Пишу свой шаблонный класс вектора и столкнулся со странной проблемой: при вызове функции reserve, которая, если верить описанию, должна увеличить емкость вектора, если текущая емкость меньше заданной, происходит ошибка времени компиляции (если я правильно классифицировал ошибку).
Вот сама функция:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template<class T>
void array<T>::reserve(std::size_t size)
{
    if(this->capacity_ < size)
    {
        array<T> buffer(*this);
        this->clear();
        this->array_ = new T[size];
        this->capacity_ = size;
        this->size_ = buffer.size_;
 
        for(std::size_t i = 0; i < this->size_; ++i)
        {
            (*this)[i] = buffer[i];
        }
        //buffer.clear();
        //delete[] buffer.array_;
// buffer.~array();
    }
}
Если закомментировать строку, которая должна освобождать память, выделенную для объекта buffer, то все работает корректно, однако если освободить ее вручную, то происходит эта ошибка.
Почему так? Правильно ли я понимаю, что компилятор сам освободит выделенную память локального объекта? И если я ее освобождаю вручную, то он пытается вызвать дестркутор этого объекта и освободить уже освобожденную память?
Однако, не противоречит ли это правилу: "выделил память - не забудь ее освободить"?

Собственно, дестркутор и функция clear, и конструктор копирования с операций присваивания:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    ~array() { this->clear(); }
    inline void clear() { delete[] this->array_; }
template<class T>
array<T>::array(const array<T> &copy)
{
    *this = copy;
}
template<class T>
array<T>::array(const iterator beg, const iterator end)
{
    std::size_t distance = int(end) - int(beg);
    this->array_ = new T[distance];
    this->size_ = distance;
    this->capacity_ = distance;
    for(std::size_t i = 0; i < distance; ++i)
        (*this)[i] = *(beg + i);
}
Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru