Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 23
1

Динамическое выделение памяти

22.10.2016, 07:53. Показов 1471. Ответов 16
Метки нет (Все метки)

Добрый день!
пытаюсь освоить С++ и дошёл до раздела динамического выделения памяти. Беру пример с сайта cppstudio.com всё работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int main(int argc, char* argv[])
{
 int *ptrvalue = new int; // динамическое выделение памяти под объект типа int
 *ptrvalue = 9; // инициализация объекта через указатель
 //int *ptrvalue = new int (9); инициализация может выполнятся сразу при объявлении динамического объекта
 cout << "ptrvalue = " << *ptrvalue << endl;
 delete ptrvalue; // высвобождение памяти
 system("pause");
return 0;
}
делаю по аналогии свой вариант (просто для пробы) и при выполнении выбрасывает ошибку выполнения Microsoft Visual C++ Runtime library, Debug Assertion failed
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "stdafx.h"
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    int *p = new int [1];
    p[0] = 456;
    p[1] = 34;
    for (int x = 0; x< 2; x++) {
        std::cout << *p << std::endl; p++;
    }
    delete[] p;
    system ("pause");
    return 0;
}
подскажите в чём моя ошибка?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.10.2016, 07:53
Ответы с готовыми решениями:

Распределение памяти. Динамическое выделение памяти
an-1 an-2 ... a2

Динамическое выделение памяти
Всем здрасти.Если выделять динамически память,например: char *p=new char; и при этом не...

Динамическое выделение памяти
Подскажите как выделить динамически память мод двумерный массив... Спасибо. ... int *mass = new...

Динамическое выделение памяти
Объясните пожалуйста.Не могу понять в чём разница между malloc,calloc/free и new/delete

16
7158 / 6133 / 2801
Регистрация: 14.04.2014
Сообщений: 26,455
22.10.2016, 07:57 2
Выделяешь 1 элемент, а обращаешься к двум. Как так?
1
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 23
22.10.2016, 08:14  [ТС] 3
nmcf, не соглашусь! Почему один ? Выделяю два [0], [1]. Если закомментить функцию delete, то код компилируется и выполняется без ошибок
0
Модератор
Эксперт по электронике
8569 / 6385 / 859
Регистрация: 14.02.2011
Сообщений: 22,214
22.10.2016, 08:19 4
Цитата Сообщение от Viktor_Repin Посмотреть сообщение
Выделяю два [0], [1].
выделяешь ОДИН!!!
Цитата Сообщение от Viktor_Repin Посмотреть сообщение
C++
1
int *p = new int [1];
число в квадратных скобках означает количество, равносильно
C++
1
int *p = new int ;
Цитата Сообщение от Viktor_Repin Посмотреть сообщение
C++
1
p[0] = 456;
а вот здесь число в скобках означает индекс
Цитата Сообщение от Viktor_Repin Посмотреть сообщение
Если закомментить функцию delete, то код компилируется и выполняется без ошибок
разумеется, контроль памяти не срабатывает
ошибка как была так и осталась, просто замаскировалась
в более серьезных проектах выстрелит в любой момент
0
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 23
22.10.2016, 08:23  [ТС] 5
Мммм, странно...в учебниках про это не пишут и я наивно полагал, что объектов два. То есть, если я заменю 1 на 2 то всё будет работать?
0
Модератор
Эксперт по электронике
8569 / 6385 / 859
Регистрация: 14.02.2011
Сообщений: 22,214
22.10.2016, 08:29 6
Цитата Сообщение от Viktor_Repin Посмотреть сообщение
То есть, если я заменю 1 на 2 то всё будет работать?
Да, будет
Цитата Сообщение от Viktor_Repin Посмотреть сообщение
в учебниках про это не пишут
почитай про массивы
1
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 23
22.10.2016, 15:14  [ТС] 7
Спасибо Вам за совет! Попробую!

Добавлено через 5 часов 51 минуту
ValeryS, попробовал заменить 1 на 2...ничего не изменилось
0
7158 / 6133 / 2801
Регистрация: 14.04.2014
Сообщений: 26,455
22.10.2016, 15:21 8
Цитата Сообщение от Viktor_Repin Посмотреть сообщение
попробовал заменить 1 на 2...ничего не изменилось
Показывай.
0
11 / 11 / 7
Регистрация: 15.10.2012
Сообщений: 83
22.10.2016, 15:24 9
C++
1
std::cout << p[x] << std::endl;
и все работает
0
191 / 127 / 52
Регистрация: 19.01.2010
Сообщений: 518
22.10.2016, 15:41 10
Цитата Сообщение от Viktor_Repin Посмотреть сообщение
C++
1
2
3
4
for (int x = 0; x< 2; x++) {
    std::cout << *p << std::endl; p++;
}
delete[] p;
Ошибка в инкременте указателя в цикле. После выхода из цикла, "р" указывает на другой участок памяти, а не тот, который был ему выделен оператором "new". Соответственно delete пытается освобождать другой кусок памяти. Раз уж хотите именно так выводить, то правильно будет так:
C++
1
2
3
4
5
6
//...
int* ptr = p;
for (int x = 0; x< 2; x++) {
    std::cout << *ptr << std::endl; ptr++;
}
 delete[] p;
ну а лучше канеш к массиву по индексу обращаться:
C++
1
2
3
4
for (int x = 0; x< 2; x++) {
    std::cout << p[x]<< std::endl; 
}
delete[] p;
0
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 23
22.10.2016, 15:50  [ТС] 11
Хм...спасибо, буду пробовать! Что-то пока четкого понимания этого механизма не складывается
1
7158 / 6133 / 2801
Регистрация: 14.04.2014
Сообщений: 26,455
22.10.2016, 15:50 12
Можно ещё после цикла:
C++
1
p -= 2;
0
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 23
22.10.2016, 16:38  [ТС] 13
nmcf, то есть вернуться к нулевому индексу?
Вроде все просто, но как запутанно
0
Эксперт С++
4974 / 3082 / 456
Регистрация: 10.11.2010
Сообщений: 11,160
Записей в блоге: 10
22.10.2016, 17:26 14
Очень запутанно...
0
7158 / 6133 / 2801
Регистрация: 14.04.2014
Сообщений: 26,455
22.10.2016, 17:42 15
Лучший ответ Сообщение было отмечено Viktor_Repin как решение

Решение

Viktor_Repin, что запутано? Адрес должен быть тот, который выдан new.
1
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 23
23.10.2016, 19:02  [ТС] 16
nmcf, точно! попробовал осуществить возврат к первоначальному индексу и всё заработало! попробую ещё попрактиковаться, чтобы окончательно освоить. Спасибо огромное за советы - очень помогает, когда есть сообщество помогающее новичкам преодолеть трудности освоения.
еще раз спасибо!
PS жаль, что компилятор не выявляет таких проблем...

Добавлено через 18 минут
учитывая, что код может быть весьма большим и не всегда есть возможность отследить когда был изменен индекс, есть ли способ автоматического возврата индекса к первоначальному?
0
Модератор
Эксперт по электронике
8569 / 6385 / 859
Регистрация: 14.02.2011
Сообщений: 22,214
23.10.2016, 19:07 17
Цитата Сообщение от Viktor_Repin Посмотреть сообщение
есть ли способ автоматического возврата индекса к первоначальному?
есть и он заключается в неизменении указателя который вернул new
для работы используются копии
как и показал Selot,
Цитата Сообщение от Selot Посмотреть сообщение
C++
1
2
3
4
5
6
//...
int* ptr = p;
for (int x = 0; x< 2; x++) {
    std::cout << *ptr << std::endl; ptr++;
}
 delete[] p;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.10.2016, 19:07

Динамическое выделение памяти new
Доброго времени всем :) Недавно начал вникать в прелести c++, однако встретился с неприступной...

Динамическое выделение памяти
Доброго времени суток всем!:) Есть такая проблема... Дан класс полином. который содержит закрытые...

Динамическое выделение памяти
Подскажите пожалуйста почему этот код работает: #include &lt;iostream&gt; using namespace std; ...

Динамическое выделение памяти
Здраствуйте. Собственно сам код и вопрос: почему могу свободно выходить за границы массива? Для...

Динамическое выделение памяти
Использовать динамическое выделение памяти для программы : #include &quot;stdafx.h&quot; #include...

Динамическое выделение памяти
Всем здравствуйте) помогите пожалуйста))) Контрольные вопросы 1. Раскройте понятие указателя в...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru