Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677

Ошибка деструктора - В конструкторе происходит выход за границу массива

05.07.2014, 21:21. Показов 1803. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени.

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
#include <iostream.h>
#include <math.h>
 
class OKTAVE
{
public:
    OKTAVE(unsigned int Leng)
    {
        leng=Leng;
        wave=new signed short(leng);
        for(count=0;count<leng;count++)
        {
            wave[count]=(signed short)(32768*sin(count*3.1415927/leng));
            count++;
        }
        count=0;
    }
    ~OKTAVE(){delete[]wave;}
 
private:
    signed short*wave;
    unsigned short count,leng;
};
 
int main()
{
    OKTAVE okt(1024);
 
    return 0;
}
Похоже на то, что в конструкторе происходит выход за границу массива, но не пойму, вроде же порядок...помогите.

Добавлено через 1 минуту
При удалении экземпляра класса вылетает ошибка
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.07.2014, 21:21
Ответы с готовыми решениями:

При копировании массива происходит выход за его пределы (Ошибка 216)
подскажите пожалуйста почему после процедуры mas мне выдает 216 ошибку и как ее исправить ? type mass=array of integer; ...

Выход за границу массива
Допустим имеем list1 = сравниваю условия в цикле for num in list1: if list1 == list1 pass k+=1 Как можно...

Выход за границу массива
не работает если ввести более 10 символов. подскажите где ошибка? do while неправильно организовал? #include &lt;stdio.h&gt; int...

22
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
05.07.2014, 21:22
14-ю строку убери.
1
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
05.07.2014, 21:35  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
14-ю строку убери.
Туплю =)
Спасибо.

Добавлено через 48 секунд
Не помогло.

Добавлено через 1 минуту
Всё та же ошибка вылетает.

Добавлено через 1 минуту
Надо воздухом подышать...перепутал [] c (). Тема закрыта.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.07.2014, 11:03
Цитата Сообщение от Retyrn0 Посмотреть сообщение
C++
1
#include <iostream.h>
Пора подумать о замене компилятора.
Дополнительно:
Вместо ручного выделения памяти можно рассмотреть std::vector. Это позволит например избавиться от деструктора.
Странно использовать под переменную цикла поле класса.
short по умолчанию и так signed.
Для числа Пи есть константа M_PI
Для граничных значений типа T имеет смысл использовать std::numeric_limits<T>
1
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
06.07.2014, 13:23  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Пора подумать о замене компилятора.
Новые версии долговато компилируют =/
Цитата Сообщение от Tulosba Посмотреть сообщение
Странно использовать под переменную цикла поле класса.
count выполняет в классе важную роль - я не все методы копировал сюда...маничка такая у меня - не люблю создавать переменные, если есть уже созданные, не используемые(она используется после инициализации в др. методе.)
Цитата Сообщение от Tulosba Посмотреть сообщение
Вместо ручного выделения памяти можно рассмотреть std::vector. Это позволит например избавиться от деструктора.
Массив выделяется единожды и многообразие возможностей вектора здесь излишни. Пардон за сленг, но мне не впадлу написать целую строчку в деструкторе
Но спасибо за замечания, гляну что можно сделать.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.07.2014, 14:07
Retyrn0, новые версии - это в первую очередь новые возможности и исправление ошибок и недочетов (с внесением новых конечно же). Вообще, когда начинается разговор о скорости, надо приводить конкретные тесты, иначе всё это пустое. К тому же удивительно, что Вы замечаете разницу в скорости на тривиальных программах.
Цитата Сообщение от Retyrn0 Посмотреть сообщение
не люблю создавать переменные, если есть уже созданные, не используемые
Использовать одинаковые переменные для разных целей - не лучший вариант, т.к. смахивает на преждевременную оптимизацию. А оптимизация, как известно, в первую очередь негативно сказывается на понимании кода.
Хотя случай со счетчиком немного из другой оперы, и выносить его в члены класса не стоит, так он не имеет отношения к состоянию объекта, но при этом увеличивает его размер.
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Массив выделяется единожды
Так и вектор выделит память однократно при правильном использовании.
Меньше ручного управления памятью - меньше ошибок. Возможно Вам вообще стоило бы тогда отказаться от динамического выделения памяти, если пугает потенциальный оверхед от использования вектора.
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
06.07.2014, 14:20  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
одинаковые переменные для разных целей
цель соответствует названию - счётчик. Он и в конструкторе и в методах считает текущую позицию в массиве, только в конструкторе для инициализации.

Цитата Сообщение от Tulosba Посмотреть сообщение
Хотя случай со счетчиком немного из другой оперы, и выносить его в члены класса не стоит, так он не имеет отношения к состоянию объекта, но при этом увеличивает его размер.
Цитата Сообщение от Retyrn0 Посмотреть сообщение
count выполняет в классе важную роль
Он используется классом и напрямую имеет отношение к состоянию объекта. Просто здесь не все методы, иначе было бы понятно.
Цитата Сообщение от Tulosba Посмотреть сообщение
отказаться от динамического выделения памяти
Размер массива в разных экземплярах класса разный - без динамического выделения никуда.
Мне нужно в начале выделить, в конце уничтожить - всё. Это 2 строчки, здесь сложно наделать ошибок. И на утечки я проверяю, так что с этим у меня всегда был порядок)
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.07.2014, 14:51
Retyrn0, если счетчик имеет отношение к состоянию объекта, то он не должен использоваться как переменная цикла. Так что определиться все таки не помешает для чего же он предназначен. Вы используете значение счетчика в каком-нибудь методе после установки его в другом? Можете показать пример?
И на утечки я проверяю, так что с этим у меня всегда был порядок
Слишком самоуверенно. Будь оно все так легко и просто, классы "умных" указателей вообще бы никогда не появились, т.к. не были бы востребованы.

Добавлено через 1 минуту
На счет разного размера массива - можно и шаблон класса сделать с размером в качестве аргумента. Без динамического выделения.
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
06.07.2014, 15:09  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
если счетчик имеет отношение к состоянию объекта, то он не должен использоваться как переменная цикла. Так что определиться все таки не помешает для чего же он предназначен. Вы используете значение счетчика в каком-нибудь методе после установки его в другом? Можете показать пример?
Метод конструктора запускается единожды, при инициализации, и пока не выполнилась инициализация, остальные методы не могут запуститься, так что одновременный доступ исключён. В конструкторе в конце есть
Цитата Сообщение от Retyrn0 Посмотреть сообщение
count=0;
Т.е. конструктор после выполнения необходимых вертикулей обнуляет его и больше НИКОГДА не использует, соответственно до завершения работы конструктора никакой метод, использующий count не может быть запущен - здесь полный порядок, не переживайте)
Цитата Сообщение от Tulosba Посмотреть сообщение
Слишком самоуверенно.
Я привык к низкоуровневости - я не просто знаю что после чего нужно писать, а понимаю что происходит с байтами. А классы умных указателей придумали не потому что не возможно грамотно работать с памятью, а скорее для удобства.
Цитата Сообщение от Tulosba Посмотреть сообщение
На счет разного размера массива - можно и шаблон класса сделать с размером в качестве аргумента. Без динамического выделения.
Зачем? Всё же и так работает правильно. К чему усложнять? Всего-то 2 строчки с new[] и delete[]. Зачем шаблоны класса и пр? Не исключаю, что в другой задаче я бы согласился(где сложно определить когда выделять, когда удалять память), но здесь всё лаконично и понятно.
0
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
06.07.2014, 15:53
Цитата Сообщение от Retyrn0 Посмотреть сообщение
маничка такая у меня - не люблю создавать переменные, если есть уже созданные
Как человек, который тоже этим в далеком прошлом переболел, советую от этой мании избавляться. Во-первых память на стеке выделяется очень быстро. Ты ничего не выиграешь на этом. Особенно на современных процессорах (почитай про конвейеры и кеш).
Во-вторых, в будущем при профессиональной разработке в команде могут быть проблемы с сопровождением такого кода другими людьми. Увидит человек переменную-счетчик, а определения рядом нет. Значит какой вывод? Правильно, она где-то еще используется, и возможно является частью какого-то нетривиального алгоритма (ну он же не знает про твой хитрый план экономии переменных). И вот полезет он шерстить все методы, где еще эта переменная используется, потратит время, поругается. В целом все это довольно неприятно. Есть такой принцип - "принцип наименьшего удивления". В твоем маленьком коде это не очевидно, но когда проект на пару сотен тысяч строк - это очень серьезный фактор, когда что-то сделано не как обычно.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.07.2014, 15:59
Цитата Сообщение от Retyrn0 Посмотреть сообщение
никакой метод, использующий count
Не надо лить воду про конструктор - покажите лучше этот метод.
Цитата Сообщение от Retyrn0 Посмотреть сообщение
а понимаю что происходит с байтами
И что же с ними происходит?
Цитата Сообщение от Retyrn0 Посмотреть сообщение
но здесь всё лаконично и понятно.
Какой вариант лаконичнее:
C++
1
2
3
4
5
6
7
8
class A
{
public:
    A(int size) { data = new int[size]; }
    ~A() { delete [] data; }
private:
    int* data;
};
или
C++
1
2
3
4
5
6
7
class B
{
public:
    B(int size) : data(size) { }
private:
    std::vector<int> data;
};
?
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
06.07.2014, 16:22  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Во-первых память на стеке выделяется очень быстро
Я не о скорости...
Как же объяснить то...по вашему я должен быть создать внутри конструктора переменную count1 ну или count? А зачем, если она и так есть и пока свободна?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.07.2014, 16:28
Цитата Сообщение от Retyrn0 Посмотреть сообщение
по вашему я должен быть создать внутри конструктора переменную count1 ну или count?
Для цикла следовало бы задать свою переменную:
C++
1
for(int i=0; i<leng; i++) ...
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
06.07.2014, 16:28  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
покажите лучше этот метод
C++
1
2
3
4
5
6
signed short SetSempl(signed short sempl)
{
   wave[count]=sempl;
   count++;
   if(count>len)count=0;
}
Цитата Сообщение от Tulosba Посмотреть сообщение
Какой вариант лаконичнее:
У меня лично первый вариант не вызывает никаких проблем.
Цитата Сообщение от Tulosba Посмотреть сообщение
И что же с ними происходит?
Веселье там, жизнь ХД
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.07.2014, 16:31
Retyrn0, не логичнее было бы сделать так?
C++
1
2
3
4
5
short SetSempl(short sempl, int index)
{
   // здесь проверить index на диапазон
   wave[index]=sempl;
}
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
06.07.2014, 16:34  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Для цикла следовало бы задать свою переменную
Да что Вы придрались к моей переменной? Пусть себе считает)

Добавлено через 2 минуты
Цитата Сообщение от Tulosba Посмотреть сообщение
не логичнее было бы сделать так?
Видите ли, каждый экземпляр класса имеет разную длину. Что я им должен передавать в качестве index?
0
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
06.07.2014, 16:34
Цитата Сообщение от Retyrn0 Посмотреть сообщение
по вашему я должен быть создать внутри конструктора переменную count1 ну или count?
Нет. Т.к. ты не выложил или не рассказал на словах зачем нужна переменная count в классе, то выводы пока делать рано.
Цитата Сообщение от Retyrn0 Посмотреть сообщение
А зачем, если она и так есть и пока свободна?
Это зависит от многих факторов, о которых ты не рассказал. Но я говорил не про этот конкретный случай, а в целом. Т.е. у каждой переменной должна быть своя конкретная задача, свое предназначение. Если переменная по совместительству и швец и жнец, то это порождает проблемы, о которых я писал выше.
0
45 / 48 / 5
Регистрация: 24.06.2013
Сообщений: 677
06.07.2014, 16:38  [ТС]
Получается, что я должен отдельно от класса создать массив индексов, обрабатывать их в основном цикле? Но зачем мне тогда вообще нужен будет класс? - Создать сразу и массивы, как не объектные переменные и радоваться жизни

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
о которых ты не рассказал
Я же сразу намекнул, что я рассказал не всё и что там порядок.
Цитата Сообщение от DrOffset Посмотреть сообщение
по совместительству и швец и жнец
У меня она по совместительству и швец и швец) А вот зачем мне два швеца не знаю)
0
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
06.07.2014, 16:41
Цитата Сообщение от Retyrn0 Посмотреть сообщение
что я рассказал не всё и что там порядок.
Да даже дядькам с 20+ лет опыта не стоит верить про порядок
Цитата Сообщение от Retyrn0 Посмотреть сообщение
У меня она по совместительству и швец и швец) А вот зачем мне два швеца не знаю)
Вот на что я точно не надеялся, что ты сразу же переменишь свое мнение. Остальное к опытом придет.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
06.07.2014, 16:44
Цитата Сообщение от Retyrn0 Посмотреть сообщение
Да что Вы придрались к моей переменной? Пусть себе считает)
Я просто даю советы, которые считаю правильными. Прислушиваться к ним или нет - дело сугубо личное.
Однако, есть общепризнанные практики и правила хорошего тона программирования. Если их не придерживаться, будет трудно контролировать код в процессе его развития.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.07.2014, 16:44
Помогаю со студенческими работами здесь

Выход за границу массива
на строке if (A == num) выдает ошибку и пишет выход за границу массива. В чем ошибка? Console::WriteLine(); ...

Выход за границу массива
Не могу понять почему выходит за границы индекса массива. using System; namespace ConsoleApplication4 { class Program ...

Ошибка-выход за границу диапазона
Дана задача:Дан массив X(N,M). Найти произведение элементов тех столбцов массива, в которых все элементы положительные. Из полученных...

Выход индекса за границу массива
При запуске получаю сообщение о том, что индекс выходит за границу массива в строке. Прошу указать на ошибку. string data =...

Почему выход за границу массива?
Господа подскажите пожлст, почему в этом коде происходит выход за границу массива. ВСЕМ СПАСИБО. using System; class a { static...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru