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

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

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

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

24.08.2013, 18:41. Просмотров 2136. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.08.2013, 18:41     Непонятки с классами
Посмотрите здесь:

непонятки с делением:( C++
C++ непонятки
Непонятки с чаром C++
непонятки с матрицой C++
непонятки с указателями C++
C++ Непонятки со списком
Непонятки с синтаксисом C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.08.2013, 18:49     Непонятки с классами #2
Наверное, так нужно, в конструкторах:
C++
1
order = new bool[numElem];
KokosSPb
32 / 82 / 3
Регистрация: 03.02.2011
Сообщений: 463
24.08.2013, 18:53  [ТС]     Непонятки с классами #3
Блин, а я ведь проверял, но почему-то ошибка оставалась, сейчас опять поменял, так уже - поскольку вариантов больше не видел и ошибка ушла... Как так?

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

Добавлено через 3 минуты
C++
1
order = new bool(numElem);
Так один элемент типа bool создаётся, инициализируется значением numElem (приводится к bool).
Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
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) {...}
KokosSPb
32 / 82 / 3
Регистрация: 03.02.2011
Сообщений: 463
24.08.2013, 19:02  [ТС]     Непонятки с классами #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Разве?

Добавлено через 3 минуты
C++
1
order = new bool(numElem);
Так один элемент типа bool создаётся, инициализируется значением numElem (приводится к bool).
Я проверил, создается массив
Olivеr
411 / 407 / 13
Регистрация: 06.10.2011
Сообщений: 830
24.08.2013, 19:04     Непонятки с классами #7
KokosSPb, operator new []
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.08.2013, 19:05     Непонятки с классами #8
Цитата Сообщение от KokosSPb Посмотреть сообщение
Я проверил
Как?
KokosSPb
32 / 82 / 3
Регистрация: 03.02.2011
Сообщений: 463
24.08.2013, 20:41  [ТС]     Непонятки с классами #9
Создал int массив и так и так, (через () и через []), заполнил его, обратился к элементам, в обоих случаях всё сработало
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.08.2013, 20:48     Непонятки с классами #10
Цитата Сообщение от KokosSPb Посмотреть сообщение
Создал int массив и так и так, (через () и через []), заполнил его, обратился к элементам, в обоих случаях всё сработало
Это не проверка того, что массив был создан. Всё что вы описали (при использовании ()), было за пределами выделенной памяти. Что работало, дело случая. Может работать, может не работать (тема с чего началась?). Компилятор не отслеживает выход за границу выделенной памяти (ошибка возникает во время работы программы), это на совести программиста.
alsav22
5415 / 4811 / 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;
}
Миниатюры
Непонятки с классами  
KokosSPb
24.08.2013, 22:31  [ТС]
  #12

Не по теме:

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

alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
24.08.2013, 22:38     Непонятки с классами #13
Цитата Сообщение от KokosSPb Посмотреть сообщение

Не по теме:

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

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

а сказано к
Цитата Сообщение от alsav22 Посмотреть сообщение
Это не проверка того, что массив был создан. Всё что вы описали (при использовании ()), было за пределами выделенной памяти. Что работало, дело случая. Может работать, может не работать (тема с чего началась?). Компилятор не отслеживает выход за границу выделенной памяти (ошибка возникает во время работы программы), это на совести программиста.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2013, 15:26     Непонятки с классами
Еще ссылки по теме:

C++ Непонятки по ссылкам
C++ непонятки с for
C++ Непонятки с выводом
C++ Непонятки с указателями
Непонятки с рандомом C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5415 / 4811 / 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;
}
Получаем уже совсем другой результат.
Миниатюры
Непонятки с классами  
Yandex
Объявления
25.08.2013, 15:26     Непонятки с классами
Ответ Создать тему
Опции темы

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