Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
snql
3 / 3 / 1
Регистрация: 16.02.2010
Сообщений: 26
1

Ошибка при использовании оператора delete в Visual Studio 2010

30.03.2011, 01:28. Просмотров 1315. Ответов 4
Метки нет (Все метки)

Изучаю указатели в C++. Есть следующий код:
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
#include <iostream>
#include <locale>
 
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
    char **month = new char* [12];
    for (int i = 0; i < 12; i++)
    {
        month[i] = new char[20];
        switch(i)
        {
        case 0 : month[i] = "Январь"; break;
        case 1 : month[i] = "Февраль"; break;
        case 2 : month[i] = "Март"; break;
        case 3 : month[i] = "Апрель"; break;
        case 4 : month[i] = "Май"; break;
        case 5 : month[i] = "Июнь"; break;
        case 6 : month[i] = "Июль"; break;
        case 7 : month[i] = "Август"; break;
        case 8 : month[i] = "Сентябрь"; break;
        case 9 : month[i] = "Октябрь"; break;
        case 10 : month[i] = "Ноябрь"; break;
        case 11 : month[i] = "Декабрь"; break;
        }
    }
    int *kol = new int[12];
    int *sum = new int;
    *sum = 0;
    for (int i = 0; i < 12; i++)
    {
        cout << "Желаемые продажи за " << month[i] << ": ";
        cin >> kol[i];
        *sum += kol[i];
    }
 
    cout << "Продажи за год составят: " << *sum << endl;
    
        delete []sum;
    delete []kol;
    for (int i = 0; i < 12; i++)
        delete [] month[i];
    delete [] month;
}
Прогоняю программу в отладчике. При освобождении памяти, в последних строках, студия 2010 начинает ругаться, а именно "delete [] month[i];" Этот же код в Dev C++ работает без проблем. В чем ошибка?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2011, 01:28
Ответы с готовыми решениями:

Ошибка при установке Visual Studio 2010
не удается открыть файл данных C:Users\Викуша\AppData\Local\Tmps\SIT33758.tmp\defFactory.dat Как...

visual studio 2010 ultimate. ошибка при компиляции!!!
всем привет! решил изучать язык программирование C++ скачал штук 50 книг, открываю книгу,...

При запуске скомпилированного проекта Visual Studio 2010 возникает ошибка: В ходе построения произошли ошибки
Последние 7 листингов из книги не работают. Не могут они все быть с ошибками. Скорее всего что-то...

Ошибка при использовании new[] / delete[]
Здравствуйте. Пишу учебную программу, моделирующую движение лифта (если кто учебник Дейтелов читал,...

Ошибка при использовании delete
И снова здравствуйте! Пишу раз третий.Я уже готов убицца ап сцену изза этого delete.Я не понимаю...

4
bigredcat
370 / 317 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
30.03.2011, 06:55 2
Подозреваю, что вы здесь делаете совсем не то, что хотели:
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
char **month = new char* [12];
for (int i = 0; i < 12; i++)
{
    // Выделяете память и устанавливаете на нее указатель month[i]
    month[i] = new char[20];
 
    // Здесь вы не копируете строки, а устанавливаете этот же указатель month[i]
    // на константную строку, т.е. заносите в month[i] новый адрес. А память
    // выделенную ранее теряете. Вы вот посмотрите в отладчике что с адресом
    // хранимым в month[i] произойдет дальше.
    switch(i)
    {
    case 0 : month[i] = "Январь"; break;
    case 1 : month[i] = "Февраль"; break;
    case 2 : month[i] = "Март"; break;
    case 3 : month[i] = "Апрель"; break;
    case 4 : month[i] = "Май"; break;
    case 5 : month[i] = "Июнь"; break;
    case 6 : month[i] = "Июль"; break;
    case 7 : month[i] = "Август"; break;
    case 8 : month[i] = "Сентябрь"; break;
    case 9 : month[i] = "Октябрь"; break;
    case 10 : month[i] = "Ноябрь"; break;
    case 11 : month[i] = "Декабрь"; break;
    }
}
А потом вы пытаетесь освободить память, которую не выделяли динамически
C++
1
2
for (int i = 0; i < 12; i++)
    delete [] month[i];
Не знаю как уж переваривает это GCC
1
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
30.03.2011, 10:56 3
Строки 12, 43, 44 лишние.

Добавлено через 1 минуту
Массив месяцев можно сделать статической константой. Если не собираетесь выносить названия месяцев в ресурсы.)
1
xAtom
918 / 743 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
30.03.2011, 11:25 4
Смешно просто, Вы месяцы присвиваете как статические строки для чего вообще вам нужна динамическая память, для этого поменяйте присвоение = , на strcpy(month[i], "месяц");
Вы как будущий программист должны понимать, вот посмотрите число названий месяцев это const значить уже можно сделать массив статическим. Ошибки переполнения буфера не сразу трассируется стеком а только когда вы начинаете пытаться освободить память которая вашей программе не принадлежит т.п...
1
snql
3 / 3 / 1
Регистрация: 16.02.2010
Сообщений: 26
30.03.2011, 17:37  [ТС] 5
Спасибо, сегодня утром нашел такое же решение, используя strcpy();

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
#include <iostream>
#include <cstring>
#include <locale>
 
using namespace std;
 
int main()
{
    setlocale(LC_CTYPE, "Russian");
    char **month = new char* [12];
    for (int i = 0; i < 12; i++)
    {
        month[i] = new char[20];
        switch(i)
        {
            case 0 : strcpy(month[i], "Январь"); break;
            case 1 : strcpy(month[i], "Февраль"); break;
            case 2 : strcpy(month[i], "Март"); break;
            case 3 : strcpy(month[i], "Апрель"); break;
            case 4 : strcpy(month[i], "Май"); break;
            case 5 : strcpy(month[i], "Июнь"); break;
            case 6 : strcpy(month[i], "Июль"); break;
            case 7 : strcpy(month[i], "Август"); break;
            case 8 : strcpy(month[i], "Сентябрь"); break;
            case 9 : strcpy(month[i], "Октябрь"); break;
            case 10 : strcpy(month[i], "Ноябрь"); break;
            case 11 : strcpy(month[i], "Декабрь"); break;
        }
    }
    int *kol = new int[12];
    int *sum = new int;
    *sum = 0;
    for (int i = 0; i < 12; i++)
    {
        cout << "Желаемые продажи за " << month[i] << ": ";
        cin >> kol[i];
        *sum += kol[i];
    }
 
    cout << "Продажи за год составят: " << *sum << endl;
    
    delete []sum;
    delete []kol;
    for (int i = 0; i < 12; i++)
        delete [] month[i];
    delete [] month;
}
Задача из книги Прата:
Допустим, что читатель занимается продажей книги "С++ для начинающих" (C++ For Fools). Напишите программу, которая требует ввода объема ежемесячных продаж этой книги в течение года ( в экземплярах книг, а не в денежном выражении). В этой программе должен быть использован цикл, приглашающий ввести данные продаж за каждый месяц. Для этого используется массив указателей типа char *, инициализированных для указания на строки названий месяцев года, а введенные данные сохраняются в массиве значений типа int. После этого программа должна найти сумму содержимого массива и выдать отчет от общем объеме продаж за год.
0
30.03.2011, 17:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2011, 17:37

Ошибка в Visual Studio 2010
Здравствуйте, буду признателен, если поможете разобраться) Установил вот Visual Studio 2010, решил...

Ошибка в visual studio 2010 c++
Доброго времени суток, друзья! У меня такая проблема, что при запуске программы vs10 выдает...

Ошибка в visual studio 2010
как исправить эту ошибку ?


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

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

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