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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
#1

Непонятки с классами - C++

24.08.2013, 18:41. Просмотров 2502. Ответов 14
Метки нет (Все метки)

Народ, уже всё перерыл, впервые с проблемой столкнулся
Создаю консольное приложение:
файл class.h
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
#pragma once
 
class Order{
private:
    bool *order;
    int numElem;
public:
    Order(){//Конструктор с количеством элементов 256
        numElem=256;
        order = new bool(numElem);
        for(int i=0;i<numElem;i++){
            order[i]=false;
        }
    }
    Order(int num){//Конструктор с количеством элементов
        numElem = num;
        order = new bool(numElem);
        for(int i=0;i<numElem;i++){
            order[i]=false;
        }
    }
    ~Order(){//Деструктор
        delete order;
    }
    int Enter(){ //Добавление объекта и получение его id
        int i=0;
        while(order[i]){
            i++;
            if(i==numElem)return -1;
        }
        order[i]=true;
        return i;
    }
    void Leave(int elem){//Удаление объекта по id
        if(elem<numElem)
            order[elem]=false;
    }
    bool Check(int elem){
        return order[elem];
    }
protected:
};
.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include "class.h"
 
using namespace std;
 
Order *order;
 
int main(){
    order = new Order();
    cout << order->Check(0) << endl;
    system("pause");
 
    return 0;
}
При запуске вылезают ошибки в popup:
1. TestClass.exe вызвал срабатывание точки останова.
2. Необработанное исключение по адресу 0x77E7AA3C (ntdll.dll) в TestClass.exe: 0xC0000374: Куча была повреждена (параметры: 0x77E8FE38).
3. Необработанное исключение по адресу 0x60911360 (msvcp110.dll) в TestClass.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x0000001C.

Это простейшие ошибки доступа к памяти, ну например - если объявлен массив в 10 элементов, а я обращаюсь к 20тому элементу, то я тоже такие ошибки увижу, но тут то что? Помогите, прошу, никогда не встречался с такой проблемой

MSVS2012
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2013, 18:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Непонятки с классами (C++):

непонятки с for - C++
Издавна мучает вопрос почему некоторые используют в цикле for ( int i = n; i &lt; m ; i++), а другая часть населения for ( int i = n; i &lt; m ;...

непонятки - C++
у меня есть прога которая берет дабл и разделяет его на две сост. целое и дробное this-&gt;z = int(d); this-&gt;p = ( d - int(d)...

непонятки с указателями - C++
Добрый день! изучаем плюсы, наткнулся на одну странную ситуацию, не могу сообразить, в чём дело... :( Есть структура - Point...

Непонятки с указателями - C++
#include &lt;iostream&gt; using namespace std; int is_order(const int* array) { for(const int* z = array; z &lt; array +...

Непонятки со списком - C++
Нашёл код в интернете и немного не понимаю его в некоторых местах. Объясните мне пожалуйста, зачем в коде вот тут: ...

непонятки с делением:( - C++
Вот возникла такая проблемка...надо поделить числа так, что бы бралось полное цело число...т.е.: при деление 5:2=2.5=&gt; программа выводит...

14
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.08.2013, 18:49 #2
Наверное, так нужно, в конструкторах:
C++
1
order = new bool[numElem];
1
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
24.08.2013, 18:53  [ТС] #3
Блин, а я ведь проверял, но почему-то ошибка оставалась, сейчас опять поменял, так уже - поскольку вариантов больше не видел и ошибка ушла... Как так?

Массив то всё равно создается и с круглыми и с квадратными скобками
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.08.2013, 18:58 #4
Цитата Сообщение от KokosSPb Посмотреть сообщение
Массив то всё равно создается и с круглыми и с квадратными скобками
Разве?

Добавлено через 3 минуты
C++
1
order = new bool(numElem);
Так один элемент типа bool создаётся, инициализируется значением numElem (приводится к bool).
1
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
24.08.2013, 19:01 #5
Цитата Сообщение от KokosSPb Посмотреть сообщение
order = new bool(numElem);
C++
1
order = new bool[numElem];
Цитата Сообщение от KokosSPb Посмотреть сообщение
~Order(){//Деструктор
* * * * delete order;
* * }
C++
1
delete [] order;
Цитата Сообщение от KokosSPb Посмотреть сообщение
while(order[i]){
* * * * * * i++;
* * * * * * if(i==numElem)return -1;
* * * * }
C++
1
while (order[i] && i < numElem) {...}
1
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
24.08.2013, 19:02  [ТС] #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Разве?

Добавлено через 3 минуты
C++
1
order = new bool(numElem);
Так один элемент типа bool создаётся, инициализируется значением numElem (приводится к bool).
Я проверил, создается массив
0
Olivеr
412 / 408 / 13
Регистрация: 06.10.2011
Сообщений: 832
24.08.2013, 19:04 #7
KokosSPb, operator new []
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.08.2013, 19:05 #8
Цитата Сообщение от KokosSPb Посмотреть сообщение
Я проверил
Как?
0
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
24.08.2013, 20:41  [ТС] #9
Создал int массив и так и так, (через () и через []), заполнил его, обратился к элементам, в обоих случаях всё сработало
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.08.2013, 20:48 #10
Цитата Сообщение от KokosSPb Посмотреть сообщение
Создал int массив и так и так, (через () и через []), заполнил его, обратился к элементам, в обоих случаях всё сработало
Это не проверка того, что массив был создан. Всё что вы описали (при использовании ()), было за пределами выделенной памяти. Что работало, дело случая. Может работать, может не работать (тема с чего началась?). Компилятор не отслеживает выход за границу выделенной памяти (ошибка возникает во время работы программы), это на совести программиста.
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.08.2013, 20:59 #11
Вот пример выхода за пределы выделенной памяти:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main()
{
    int *arr = new int;
    for (int i = 0; i < 5; ++i)
        arr[i] = i;
 
    for (int i = 0; i < 5; ++i)
        cout << arr[i] << ' ';
 
    cout << endl;
    
 
    system("pause");
    return 0;
}
0
Миниатюры
Непонятки с классами  
KokosSPb
24.08.2013, 22:31  [ТС]
  #12

Не по теме:

Просто при создании int массива он ошибки не выдает про выход за пределы выделенной памяти

0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.08.2013, 22:38 #13
Цитата Сообщение от KokosSPb Посмотреть сообщение

Не по теме:

Просто при создании int массива он ошибки не выдает про выход за пределы выделенной памяти

Это к чему сказано? И он - это кто?
1
KokosSPb
81 / 84 / 3
Регистрация: 03.02.2011
Сообщений: 468
25.08.2013, 10:40  [ТС] #14
Цитата Сообщение от alsav22 Посмотреть сообщение
Это к чему сказано? И он - это кто?
Он, это екзешник

а сказано к
Цитата Сообщение от alsav22 Посмотреть сообщение
Это не проверка того, что массив был создан. Всё что вы описали (при использовании ()), было за пределами выделенной памяти. Что работало, дело случая. Может работать, может не работать (тема с чего началась?). Компилятор не отслеживает выход за границу выделенной памяти (ошибка возникает во время работы программы), это на совести программиста.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
25.08.2013, 15:26 #15
Имеете ввиду, что при работе ошибки нет, если есть выход за границу? Ещё раз повторю: может быть, может не быть. Зависит от разного, например от того, как далеко выход, и что там лежит. В любом случае - это кривой код. Изменяем код, в 12 посте на такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
int main()
{
    int *arr = new int;
    for (int i = 0; i < 500; ++i)
        arr[i] = i;
 
    for (int i = 0; i < 500; ++i)
        cout << arr[i] << ' ';
 
    cout << endl;
    
 
    system("pause");
    return 0;
}
Получаем уже совсем другой результат.
1
Миниатюры
Непонятки с классами  
25.08.2013, 15:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2013, 15:26
Привет! Вот еще темы с ответами:

Непонятки с wchar_t - C++
Прошу помощи: что-то не так с wchar_t. Не копирует имена файлов. Содержание program_config.txt config.cfg C:\\Projects\\abx.txt...

Непонятки по ссылкам - C++
Доброго времени суток! Помогите, пожалуйста разобраться. Изучаю ссылки и мне кое-что не понятно. Допустим мы объявили функцию: ...

Непонятки с сортировкой - C++
Добрый вечер. Практически выполнил задание, но в конце возникла проблема с сортировкой, а именно, в задании нужно ввести название товара,...

Непонятки с синтаксисом - C++
В заголовочном файле мне встретилось такое описание класса: class source_mcast_reciever { uint16_t m_port; ...


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

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

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