Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361

Выход за пределы массива при использовании оператора new

20.07.2011, 17:01. Показов 2288. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
 
 
 
int main() {
  int *i = new int[2];
  i[3]= 1;
  cout << i[3];
  return 0;
}
Вот одного ток не пойму я выделил память на 8 байт ,а почему то могу использовать больше. Почему здесь можно выходить за пределы выделенной памяти?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.07.2011, 17:01
Ответы с готовыми решениями:

Выход за пределы массива при инициализации потока
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using...

Выход за пределы массива при очистке памяти
При попытке очистить память в конце функции вылетает ошибка HEAP CORRUPTION DETECTED. Не могу найти, где именно вылез за пределы массива. ...

Выход за пределы массива при его сортировке
#include &quot;stdafx.h&quot; #include &lt;time.h&gt; #include &lt;clocale&gt; #include &lt;iostream&gt; using namespace std; int _tmain(int argc, _TCHAR*...

18
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
20.07.2011, 17:03
потому что в Си\С++ выход за пределы массива не контролируется
1
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
20.07.2011, 17:04
оператор [] не выполняет проверку валидности индекса.
ты можешь вообще не выделять память и его использовать, но попадешь ли ты при записи в критическую зону, где запись чревата вылетом (или хуже) или в зону где по случайному обстоятельству всё обойдется - это рандом.
1
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
20.07.2011, 17:04
Это только кажется, что можно. На самом деле портятся данные (возможно полезные) в соседней области данных. Можешь считать, что тебе не повезло. Если бы повезло, то программа бы упала с ошибкой.
1
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
21.07.2011, 08:42
Чтобы избежать этой ошибки, нужно использовать std::vector и оператор at(), вместо []
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
21.07.2011, 10:11
Можно даже при (случайном) выходе за пределы вектора сохранять работоспособность программы, сообщая при этом полезную информацию, например так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<vector>
#include<iostream>
 
int main(){
    int arr[]={1,2,3,4,5};
    std::vector<int> vec(arr,arr+sizeof(arr)/sizeof(*arr));
    try{
    for(int i=0;i<=5;i++)// элемента с индексом 5 несуществует
        std::cout<<vec.at(i);
    }
    catch(std::exception &e){
        std::cout<<"\nline "<<__LINE__<<" : Vector<int>vec: "<<e.what()<<std::endl;
    }
        std::cout<<"work continues\n";
    return 0;
}
Где-то читал, что вроде как рассматривается вопрос о том, чтобы оператор [] тоже выкидывал исключения, для бОльшей безопасности.
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
21.07.2011, 10:27
Цитата Сообщение от Kastaneda Посмотреть сообщение
чтобы оператор [] тоже выкидывал исключения, для бОльшей безопасности.
Слабо в это верится. Часть программистов всенепременно перестанет пользоваться вектором т.к. "медленно же будет!".
С другой стороны, в большинстве случаев использовать operator[] и at() вообще нет необходимости и их применение вызвано дурным тоном программирования и грубым рефакторингом.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
21.07.2011, 10:44
Цитата Сообщение от Deviaphan Посмотреть сообщение
С другой стороны, в большинстве случаев использовать operator[] и at() вообще нет необходимости и их применение вызвано дурным тоном программирования и грубым рефакторингом.
эмм... а какой тогда смысл в векторе остается?
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
21.07.2011, 10:52
Цитата Сообщение от Deviaphan Посмотреть сообщение
С другой стороны, в большинстве случаев использовать operator[] и at() вообще нет необходимости и их применение вызвано дурным тоном программирования и грубым рефакторингом.
Но задачи бывают разные, нельзя не согласиться, что эти операторы очень даже нужны.

Добавлено через 1 минуту
Цитата Сообщение от Deviaphan Посмотреть сообщение
т.к. "медленно же будет!".
Да, именно этим аргументируется "возможность" пересмотра оператора [], т.е. пока думают.
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
21.07.2011, 11:00
Цитата Сообщение от Kastaneda Посмотреть сообщение
что эти операторы очень даже нужны.
Безусловно нужны!
Но частенько они используются в циклах вида "for( int i; i < ; ++i) vector[i]", т.е. там, где их лучше не использовать. В том числе и с точки зрения производительности.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.07.2011, 12:44
oxotnik, Итераторы как бэ,
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
21.07.2011, 13:23
Цитата Сообщение от ForEveR Посмотреть сообщение
oxotnik, Итераторы как бэ,
и чо? (неплохой аргумент, да?)
как итератором достучаться до i-го элемента без перебора? (если мне нужен рандомный доступ по индексу, ведь для этого собственно вектор и изобретали)
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.07.2011, 13:27
oxotnik, В векторе? Ничего не перепутали?)

iter + idx.
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
21.07.2011, 13:32
Цитата Сообщение от ForEveR Посмотреть сообщение
iter + idx
Такой вариант ничем не лучше оператора[], только чтение затрудняется.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
21.07.2011, 14:13
Цитата Сообщение от ForEveR Посмотреть сообщение
oxotnik, В векторе? Ничего не перепутали?) iter + idx.
т.е. вместо одной строки (кода) мне надо сначала определить итератор, потом его спозиционировать в начало, потом прибавить к нему индекс... про читабельность кода можно сразу забыть, как кошмарный сон.
а если не дай бох массивов будет N-ое количество, то лучше сразу повеситься.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
21.07.2011, 15:29
oxotnik, Тфу.

C++
1
2
3
4
5
6
7
8
int main()
{
    std::vector<int> elem = {1,2,3,4,5,6,7,8,9,10};
    std::cout << *(elem.begin() + 5) << '\n';
    std::cout << *(elem.begin() + 2) << '\n';
    std::cout << elem[5] << '\n';
    std::cout << elem.at(2) << '\n';
}
И где несколько строк кода при работе с итераторами?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
21.07.2011, 15:43
Цитата Сообщение от ForEveR Посмотреть сообщение
И где несколько строк кода при работе с итераторами?
да, я чет не подумал о таком... но читабельности оно не прибавляет
Code
1
2
std::cout << *(elem.begin() + 5) << '\n'; // здесь надо тыщу раз подумать, что это, и что оно вернет, особенно звездочка с толку сбивает 
std::cout << elem[5] << '\n'; // тут понятно, что возвращает элемент массива
хотя, конешно дело привычки разбирать чужой код
0
Twilight Parasite
 Аватар для Invader_Zim
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
21.07.2011, 19:22
Используй malloc
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
21.07.2011, 19:27
Invader_Zim, что за шутки?
malloc пользуется какой-то запрещённой магией?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.07.2011, 19:27
Помогаю со студенческими работами здесь

Выход за пределы массива при сортировке подсчетом
Добрый день. Нужно выполнить сортировку подсчетом, при запуске программы выдает ошибку: индекс находился вне границы массива. Проблема...

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

Выход за пределы массива
Выдает ошибку &quot;Exception in thread &quot;main&quot; java.lang.ArrayIndexOutOfBoundsException: 8&quot; в строке, подскажите пожалуйста, в чем может быть...

Выход за пределы массива
в одном из обучающих видео уроков наткнулся на ТАКОЕ. алгоритм sort получает в себя начало и конец массива, далее просто выведится...

Выход за пределы массива
Тексты надо переписывать в сообщение! Я не как не пойму, где у меня выход за приделы массива Строчка 42 помогите плизз


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
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 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru