Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
SasukeSagara
24 / 24 / 13
Регистрация: 01.07.2016
Сообщений: 99
1

Ошибка при высвобождении ранее выделенной памяти под динам. массив

02.02.2017, 18:07. Просмотров 761. Ответов 4
Метки нет (Все метки)

Собственно, в чем суть:
C++
1
2
3
4
5
//инициализирую
  bool* delimeters = new bool[N];
...
//Удаляю
  delete [] delimeters;
Точки останова нигде не оставлял в коде.
Как доходит до удаления - выдает инфу о том, что "Приложением вызвана точка останова".
При нажатии кнопки "Продолжить" - работает корректно.
Скрины ниже.
Понять не могу в чем дело
0
Миниатюры
Ошибка при высвобождении ранее выделенной памяти под динам. массив   Ошибка при высвобождении ранее выделенной памяти под динам. массив  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2017, 18:07
Ответы с готовыми решениями:

Двумерный массив символов: при высвобождении памяти возникает ошибка
Подскажите, что не так делаю. При высвобождении памяти выбивает ошибку.Как...

Освобождение памяти, выделенной под массив
Выделяю память под массив: int (*array_1) = new int; как освободить...

Косвенное обращение к методам. Освобождение памяти,выделенной под двумерный динамический массив
Вопрос 1. В задании необходимо проиллюстрировать косвенный способ обращения к...

Ошибка при выделении памяти под двумерный массив
#include <iostream> using namespace std; class array { int size1, size2;...

Ошибка при удалении динамически выделенной памяти
Добрый день, хочу удалить выделенный массив, но выдает ошибку. Вот собственно...

4
MrGluck
Модератор
Эксперт CЭксперт С++
8086 / 4939 / 1431
Регистрация: 29.11.2010
Сообщений: 13,395
02.02.2017, 18:11 2
Лучший ответ Сообщение было отмечено SasukeSagara как решение

Решение

Возможно, где-то идёт копирование указателя. Нужно смотреть весь код с участием данной переменной.

Добавлено через 2 минуты
И чтобы не наступать на такие грабли стоит использовать smart pointer-ы.
C++
1
std::unique_ptr<bool[]> delimeters(new bool[N]);
1
SasukeSagara
24 / 24 / 13
Регистрация: 01.07.2016
Сообщений: 99
02.02.2017, 18:19  [ТС] 3
MrGluck, Используется переменная только при установке значений её элементов:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
if (N%(i) == 0) {
            delimeters[i] = true;
            cout << i << endl;
        }
        else
        {
            delimeters[i] = false;
        }

И в условии:
Кликните здесь для просмотра всего текста
if (delimeters[i] && delimeters[j])

Весь код:
Кликните здесь для просмотра всего текста

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "stdio.h"
#include "conio.h"
#include "windows.h"
#include <ctime>
#include <list>
#include <iostream>
using namespace std;
 
list<int> numbers_sums;
 
void main(int argc, char const *argv[])
{
    setlocale(LC_ALL, "Russian");           //setlocale(0, "");
    srand(time(0));
    int N;
    cout << "Введите натуральное число: ";
    cin >> N;
    bool* delimeters = new bool[N];
    cout << "Все делители числа " << N << " :\n";
    for (int i = 1; i < N+1; i++)
    {
        if (N%(i) == 0) {
            delimeters[i] = true;
            cout << i << endl;
        }
        else
        {
            delimeters[i] = false;
        }
    }
    cout << "Для наглядности - выведем делители и их суммы в виде таблицы\n";
    cout << "___________________________________________________________________________\n";
    cout << "|Первый делитель|\t\t|Второй делитель|\t\t|    Сумма" << endl;
    cout << "****************************************************************************\n";
    for (int i = 1; i < N+1; i++)
    {
        for (int j = 1; j < N+1; j++) {
            int k = i + j;
            if (delimeters[i] && delimeters[j])
            {
                cout << "|\t" << i << "\t|\t+\t|\t" << j << "\t|\t=\t|\t" << k << endl;
                if(k<=N)
                    numbers_sums.push_back(k);
            }
        }
    }
    cout << "****************************************************************************\n";
 
    cout << "Максимальное значение суммы делителей, не превышающее введенное число = " << numbers_sums.back() << endl;
    numbers_sums.pop_back();
    
    delete [] delimeters;
    system("pause");
}
0
MrGluck
Модератор
Эксперт CЭксперт С++
8086 / 4939 / 1431
Регистрация: 29.11.2010
Сообщений: 13,395
02.02.2017, 18:22 4
Лучший ответ Сообщение было отмечено SasukeSagara как решение

Решение

Цитата Сообщение от SasukeSagara Посмотреть сообщение
C++
1
2
3
for (int i = 1; i < N+1; i++)
{
    for (int j = 1; j < N+1; j++)
Индексация массивов в С++ начинается с 0 и идёт до N - 1
1
SasukeSagara
24 / 24 / 13
Регистрация: 01.07.2016
Сообщений: 99
02.02.2017, 18:26  [ТС] 5
MrGluck, Вот дурак �� (Всм Я)
Невнимательность =)
Спасибо за ответ
0
02.02.2017, 18:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2017, 18:26

Почему не вылетает ошибка при выделении памяти под динамический массив, размером 100 Гб?
Здравствуйте, знатоки! Столкнулся с проблемой выделения памяти под...

Функция не видит выделенной памяти под глобальные переменные
При решении задачи с алгоритмом поиска в глубину возникла проблема: описание...

Обнулить кусок памяти (выделенной под указатели) по быстрому
Есть хеш-таблица и есть кусок памяти под неё, нужно занулить изначально весь...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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