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

Heap corruption detected

01.11.2014, 20:48. Просмотров 1306. Ответов 1
Метки нет (Все метки)

Ошибка возникает после отработки программы
Заголовочный файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma once
#include<iostream>
#include<valarray>
#include<string>
 
using namespace std;
 
class Wine
{
    typedef valarray<int> ArrayInt;
    typedef pair<ArrayInt, ArrayInt> PairArray;
    string label;
    PairArray bot_ye;
    int years;
public:
    Wine();
    Wine(const char*l, int y, const int yr[], const int bot[]);
    Wine(const char* l, int y);
    void GetBottles();
    void Show();
    string& Label();
    int sum();
};
Файл реализации:
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
#include"Wine.h"
Wine::Wine() :label(), bot_ye()
{
    years = 0;
}
Wine::Wine(const char*l, int y, const int yr[], const int bot[]) : label(l), bot_ye({ y}, {y})
{
    
    years = y;
    for (int i = 0; i < years; i++)
    {
        bot_ye.first[i]=yr[i];
        bot_ye.second[i] = bot[i];
    }
    
}
Wine::Wine(const char* l, int y) :label(l), bot_ye({ y }, { y })
{
    years = y;
    
}
void Wine::GetBottles()
{
    for (int i = 0; i < years; i++)
    {
        cout << "Enter year: ";
        cin >> bot_ye.first[i];
        cout << "Enter bottle: ";
        cin >> bot_ye.second[i];
    }
}
void Wine::Show()
{
    cout << "Label: " << label<<endl;
    cout << "Year" << "\tBottle\n";
    for (int i = 0; i < years; i++)
    {
        cout << bot_ye.first[i] << "\t" << bot_ye.second[i] << endl;
    }
}
string& Wine::Label()
{
    return label;
}
int Wine::sum()
{
    int res=0;
    for (int i = 0; i < years; i++)
    {
        res += bot_ye.second[i];
    }
    return res;
}
Основная программа:
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
#include<iostream>
#include"Wine.h"
int main()
{
    using std::cin;
    using std::cout;
    using std::endl;
    cout << "Enter name of wine: "; // ввод названия вина 
    char lab[50];
    cin.getline(lab, 50);
    cout << "Enter number of years: "; // ввод количества годов сбора винограда 
    int yrs;
    cin >> yrs;
    Wine holding(lab, yrs); // сохранение названия, лет, 
    // создание массивов из yrs элементов 
    holding.GetBottles(); // предложение ввести год и количество бутылок 
    holding.Show(); // вывод содержимого объекта 
    const int YRS = 3;
    int y[YRS] = { 1993, 1995, 1998 };
    int b[YRS] = { 48, 60, 72 };
    // Создание нового объекта, инициализация 
    // с использованием данных из массивов у и b 
    Wine more("Gushing Grape Red", YRS, y, b);
    more.Show();
    cout << "Total bottles for " << more.Label() // используется метод Label() 
    << ": " << more.sum() << endl; // используется метод sum() 
    cout << "Bye\n";
    return 0;
}
Каким образом происходит выход та приделы массива не пойму.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2014, 20:48
Ответы с готовыми решениями:

Heap corruption detected
При попытке очистить память выдает &quot;Heap corruption detected&quot;. Помогите пожалуйста( //...

HEAP CORRUPTION DETECTED
Собственно такую ошибку выдаёт: &quot;HEAP CORRUPTION DETECTED: after Normal block (#220) at 0x001970B8....

Heap Corruption detected (
что не правильно? запускаю и ошибка вылетает как на предидущей картинке template&lt;typename TT&gt;...

Heap corruption detected
Добрый день! Проблема вот в чём: когда выполнение кода доходит до 163 строки, появляется ошибка: &quot;...

Heap corruption detected
Heap corruption на строке 93 при первом же выполнении цикла. Из-за чего? #include &lt;locale.h&gt; //...

1
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4853 / 2496 / 697
Регистрация: 18.10.2014
Сообщений: 4,333
01.11.2014, 23:31 2
Цитата Сообщение от VitalikFreeMan Посмотреть сообщение
Каким образом происходит выход та приделы массива не пойму.
А отладчиком кто будет пользоваться? Пушкин?

Одна ошибка очевидна. Инициализаторы '()' и '{}' для класса 'valarray' значат совершенно разные вещи. Вот это

C++
1
valarray<int> v(5);
создает массив размера 5, заполненный нулями. А вот это

C++
1
valarray<int> v{5};
создает массив размера 1 с единственным элементом, равным 5.

Поэтому ваш инициализатор 'bot_ye({y}, {y})' создает пару 'bot_ye' с двумя массива размера 1. А вы потом во всю камаринскую лезете в эти массивы по индексам от 0 до y-1. Разумеется, будет выход за пределы массива.

Поэтому если вам уж так не терпится создать векторы в списке инициализации конструктора, то 'bot_ye(ArrayInt(y), ArrayInt(y))'.

Добавлено через 6 минут
В С++11 это можно еще сделать как 'bot_ye(piecewise_construct, forward_as_tuple(3), forward_as_tuple(3))', но смысла в этом нет.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2014, 23:31

Heap Corruption Detected
Выдает ошибку HEAP CORRUPTION DETECTED, судя по всему где то ошиблась с распределением памяти...

Heap corruption detected
Возникает эта ошибка при выполнении функции Strings::Append (строка 81, в меню это пункт 3)....

heap corruption detected
имеется класс CStr - строка, в нём есть конструктор CStr CStr::CStr(char *s) { length = 0;...


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

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

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