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

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

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

Показать сообщение отдельно
Gr1f0nn
82 / 81 / 42
Регистрация: 30.09.2012
Сообщений: 408
06.07.2015, 21:53     Ошибка при резервировании памяти для своего(!) вектора
Всем здравствуйте!
Возможно, из названия темы не совсем понятен вопрос, поэтому уточню саму суть:
Пишу свой шаблонный класс вектора и столкнулся со странной проблемой: при вызове функции 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);
}
Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 19:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru