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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
snql
3 / 3 / 0
Регистрация: 16.02.2010
Сообщений: 26
30.03.2011, 01:28     Ошибка при использовании оператора delete в Visual Studio 2010 #1
Изучаю указатели в 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++ работает без проблем. В чем ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2011, 01:28     Ошибка при использовании оператора delete в Visual Studio 2010
Посмотрите здесь:

C++ ошибка при использовании delete
visual studio 2010 ultimate. ошибка при компиляции!!! C++
Ошибка в Visual Studio 2010 C++
Выдается ошибка в std при использовании оператора for C++
HELP! Ошибка при выполнении оператора delete[] C++
C++ Ошибка при установке Visual Studio 2010
Ошибка в visual studio 2010 c++ C++
C++ При запуске скомпилированного проекта Visual Studio 2010 возникает ошибка: В ходе построения произошли ошибки
Ошибка при использовании new[] / delete[] C++
C++ Visual Studio не создаёт .lib файл при использовании шаблонов
Ошибка в visual studio 2010 C++
Ошибка в Visual Studio 2010 Express C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
30.03.2011, 06:55     Ошибка при использовании оператора delete в Visual Studio 2010 #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
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
30.03.2011, 10:56     Ошибка при использовании оператора delete в Visual Studio 2010 #3
Строки 12, 43, 44 лишние.

Добавлено через 1 минуту
Массив месяцев можно сделать статической константой. Если не собираетесь выносить названия месяцев в ресурсы.)
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
30.03.2011, 11:25     Ошибка при использовании оператора delete в Visual Studio 2010 #4
Смешно просто, Вы месяцы присвиваете как статические строки для чего вообще вам нужна динамическая память, для этого поменяйте присвоение = , на strcpy(month[i], "месяц");
Вы как будущий программист должны понимать, вот посмотрите число названий месяцев это const значить уже можно сделать массив статическим. Ошибки переполнения буфера не сразу трассируется стеком а только когда вы начинаете пытаться освободить память которая вашей программе не принадлежит т.п...
snql
3 / 3 / 0
Регистрация: 16.02.2010
Сообщений: 26
30.03.2011, 17:37  [ТС]     Ошибка при использовании оператора delete в Visual Studio 2010 #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. После этого программа должна найти сумму содержимого массива и выдать отчет от общем объеме продаж за год.
Yandex
Объявления
30.03.2011, 17:37     Ошибка при использовании оператора delete в Visual Studio 2010
Ответ Создать тему
Опции темы

Текущее время: 13:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru