Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
22 / 1 / 0
Регистрация: 25.10.2016
Сообщений: 36

Освобождение памяти

24.04.2017, 14:20. Показов 3503. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс, в котором я выделяю память с помощью new. В деструкторе класса я с помощью delete освобождаю память, но у меня вылетает ошибка ещё задолго до вызова деструктора класса.
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
28
29
30
31
class Block
{
public:
    int *xpos, *ypos, *xsize, *ysize;
    sf::Texture *block_texture;
    sf::Sprite *block_sprite;
    Block(int x, int y, string fname) {
        xpos = new int;  // Выделяем место в памяти под координату по оси ox
        ypos = new int;  // Выделяем место в памяти под координату по оси ou
        xsize = new int;  // Выделяем место в памяти под размер спрайта по ширине
        ysize = new int;  // Выделяем место в памяти под размер спрайта по высоте
        block_texture = new sf::Texture;  // Выделяем место в памяти под текстуру
        block_sprite = new sf::Sprite;  // Выделяем место в памяти под текстуру
        *xpos = x;  // Записываем x
        *ypos = y;  // Записываем y
        block_texture->loadFromFile(fname);  // Загружаем изображение из файла
        block_sprite->setTexture(*block_texture);  // Добавляем текстуру в спрайт
        block_sprite->setPosition(*xpos, *ypos);  // Помешаем наш спрайт в координаты xpos;ypos
        *xsize = block_texture->getSize().x;  // Получаем ширину текстуры и записываем в xsize
        *ysize = block_texture->getSize().y;  // Получаем высоту текстуры и записываем в ysize
    }
    ~Block() {
        /*
        delete xpos;
        delete ypos;
        delete xsize;
        delete ysize;
        delete block_sprite;
        delete block_texture;*/
        
    }
все методы в классе работают правильно, программа компилируется, но при запуске меньше чем через секунду выдаёт ошибку. если код в деструкторе закомментировать, то никакой ошибки нет и программа правильно работает. вопрос: что сделать чтобы память освобождалась и где ошибка?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.04.2017, 14:20
Ответы с готовыми решениями:

Резервирование памяти/освобождение памяти для трехмерного массива
Необходимо создать трехмерный массив (A), в котором элементы вдоль направления Z выли бы выровнены по 16 байт. Есть две проблемы: ...

освобождение памяти
Помогите найти ошибку, программа вилиться когда освобождаю память! Здесь выделения памяти double **CreateArray() { double...

Освобождение памяти в c++
Привет, помогите разобраться с освобождением памяти в c++. Я так понимаю, что если освободить память, то переменная удаляется, но почему же...

25
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
24.04.2017, 15:38
Студворк — интернет-сервис помощи студентам
Действительно проблема как минимум в том, что в вектор пишется значение
Подразумевалось наверное другое
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
24.04.2017, 15:53
Цитата Сообщение от h3mbr0 Посмотреть сообщение
в вектор пишется значение
Подразумевалось наверное другое
В вектор всегда копия пишется. Причина ошибки описана во втором посте. Из-за отсутствия глубокого копирования, происходит попытка освобождения уже освобождённой памяти.
0
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
24.04.2017, 16:06
Цитата Сообщение от nd2 Посмотреть сообщение
В вектор всегда копия пишется. Причина ошибки описана во втором посте. Из-за отсутствия глубокого копирования, происходит попытка освобождения уже освобождённой памяти.
Копия чего? если я указатель в вектор пишу? копия указателя? а смысл такого утверждения?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
24.04.2017, 16:10
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Копия чего?
Того, что помещается в вектор.
Цитата Сообщение от h3mbr0 Посмотреть сообщение
если я указатель в вектор пишу? копия указателя?
Да.
Цитата Сообщение от h3mbr0 Посмотреть сообщение
а смысл такого утверждения?
Это ответ на это:
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Подразумевалось наверное другое
Что не подразумевай - пишется копия.
Поэтому, например, невозможно такое:
C++
1
2
3
    std::vector <std::fstream> v;
    std::fstream f;
    v.push_back(f);
0
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
24.04.2017, 16:15
nd2,
Я имел в виду, что передача адреса решает проблему
Конфликт интерпретаций, я - сишник
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,430
24.04.2017, 16:19
Цитата Сообщение от h3mbr0 Посмотреть сообщение
Я имел в виду, что передача адреса решает проблему
Это, да, но тогда и вектор другой должен быть. Явный конструктор копий всё равно нужен. За всеми такими местами в коде можно и не уследить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.04.2017, 16:19

Освобождение памяти
Собственно есть простенький класс class Human { public: Human ( ); void ptintHuman(); private: static long...

Освобождение памяти в C++
Добрый день! В моей программе в функции выделяется память (new char) под символьный массив, который является элементом структуры. Это...

Освобождение памяти
Маленький вопросик, как правильно освобождать память выделенную под vector&lt;...&gt;, деструктором ~vector() или методом clear() ?

Освобождение памяти
Похоже что проблема с освобождением памяти. У меня есть абстрактный класс CObject и его потомок CMeteor, в котором реализованы...

Освобождение памяти
Товарищи,недавно баловался в Microsoft VS,готовился к экзаменам,писал небольшие програмки с использованием динамических массивов.Память под...


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru