Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
snql
3 / 3 / 0
Регистрация: 16.02.2010
Сообщений: 26
#1

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

30.03.2011, 01:28. Просмотров 1256. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка при использовании оператора delete в Visual Studio 2010 (C++):

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

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

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

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

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

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

4
bigredcat
366 / 313 / 3
Регистрация: 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 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
30.03.2011, 10:56 #3
Строки 12, 43, 44 лишние.

Добавлено через 1 минуту
Массив месяцев можно сделать статической константой. Если не собираетесь выносить названия месяцев в ресурсы.)
1
xAtom
915 / 740 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
30.03.2011, 11:25 #4
Смешно просто, Вы месяцы присвиваете как статические строки для чего вообще вам нужна динамическая память, для этого поменяйте присвоение = , на strcpy(month[i], "месяц");
Вы как будущий программист должны понимать, вот посмотрите число названий месяцев это const значить уже можно сделать массив статическим. Ошибки переполнения буфера не сразу трассируется стеком а только когда вы начинаете пытаться освободить память которая вашей программе не принадлежит т.п...
1
snql
3 / 3 / 0
Регистрация: 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 c++ - C++
Доброго времени суток, друзья! У меня такая проблема, что при запуске программы vs10 выдает ошибку(см.скрин ниже). Знаю, что у многих...

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

Ошибка в Visual Studio 2010 Express - C++
#include &quot;stdafx.h&quot; #include &quot;Form1.h&quot; ;using namespace MyTest; int main(array&lt;System::String ^&gt; ^args) { // Включение...

Выдается ошибка в std при использовании оператора for - C++
Написал программу с использованием оператора for на С++. Вот код: # include &lt;iosteam&gt; int main () { int sum = 0; for...


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

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

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