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

Освобождение памяти в методе класса - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Работа с class ами. Заполнение дин. массива типа class http://www.cyberforum.ru/cpp-beginners/thread869151.html
Всем доброго времени суток! Это моя первая тема на этом сайте, поэтому если что извините меня (за неточности итд итп). Мне нужно создать заполненный дин. массив типа class ов. Я бы хотел посмотреть на какой нибудь стандартный приёмчик, как это сделать допустим с перегруженным конструктором(или ещё кое как), с одним экземпляром все ясно. Ниже приведен некий код, #include <iostream>...
C++ Задача С++ Ребят,помогите пожалуйста решить задачу в С++ http://www.cyberforum.ru/cpp-beginners/thread869149.html
Синтаксический анализатор C++
Помогите, пожалуйста, исправить код синтаксического анализатора. - оно выбрасывает программу. Надо по принципу: вот и код: #include <iostream> #include <string.h> #include <Windows.h> // using namespace std; //
Не могу получить строку C++
Здравствуйте, есть программа для перевода строки в Морзянку, но если выполнять считывание с клавиатуры то программа будет считывать только 1 или последнеее слово а не всю строку . Чувствую проблема гдето здесь: cin>>a; getline(cin, a); Пожалуйста , помогите кому не трудно. #include <iostream> #include <fstream> #include <string> using namespace std;
C++ какое значение будет выведено при выполнении операторов http://www.cyberforum.ru/cpp-beginners/thread869127.html
помогите пожалуйста.
C++ istreambuf_iterator Кто знает, как через istreambuf_iterator заменить "Inf" на -1? подробнее

Показать сообщение отдельно
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
18.05.2013, 14:36     Освобождение памяти в методе класса
Цитата Сообщение от fcshadow Посмотреть сообщение
И почему все-таки нельзя писать delete[] head?
Потому что проблема не в приведённом вами куске кода.

Цитата Сообщение от fcshadow Посмотреть сообщение
А можно поподробнее как? А то я что-то не очень понимаю.
Ну вот у вас есть какой-то стек:
C++
1
2
3
4
5
6
7
8
template <class T>
class stack {
// ...
private:
    T *m_data;
    size_t m_capacity; // размеры m_data
    size_t m_top; // индекс верхушки
};
Суть shrink_to_fit() — это сделать так, чтобы (m_top + 1) == m_capacity. Проблему можно разбить на два куска: 1) оставить только элементы до m_top, 2) оставить эти элементы в этом стеке, а не где-то ещё. Первая проблема в принципе решается конструктором копирования:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <class T>
stack<T>::stack(const stack<T> &other)
  : m_data(0)
  , m_capacity(0)
  , m_top(0)
{
    if (other.empty()) {
        return;
    }
 
    m_data = new T[other.size()];
    m_capacity = other.size();
    m_top = other.size() - 1;
    for (size_t i = 0; i < other.size(); i++) {
        m_data[i] = other.m_data[i];
    }
}
Вот только беда: правильные данные находятся в другом стеке — копии того, который передали. Но это не проблема, если есть функция swap() меняющая стеки местами:
C++
1
2
3
4
5
6
7
template <class T>
void stack<T>::swap(T &other)
{
    std::swap(m_data, other.m_data);
    std::swap(m_capacity, other.m_capacity);
    std::swap(m_top, other.m_top);
}
Теперь можно написать так:
C++
1
2
3
4
5
template <class T>
void stack<T>::shrink_to_fit()
{
    stack<T>(*this).swap(*this);
}
Делается копия текущего стека, содержащая только значащие элементы. Потом её содержимое и содержимое текущего стека меняются местами. Текущий стек содержит только значащие элементы, а содержимое временного стека будет прибито деструктором при выходе из функции.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru