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

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

22.10.2016, 07:53. Просмотров 800. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2016, 07:53
Ответы с готовыми решениями:

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

Динамическое выделение памяти
Первый раз столкнулся с такой задачей... Дали лабораторную работу: Разработать...

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

Динамическое выделение памяти
Вот у меня есть 2 примера: char* str = &quot;Немыслимый текст&quot;; char* s = new...

Динамическое выделение памяти
Имеется такая вот задача ! Нужно сделать что бы память выделялась динамически,а...

16
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
22.10.2016, 07:57 2
Выделяешь 1 элемент, а обращаешься к двум. Как так?
1
Viktor_Repin
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 23
Завершенные тесты: 1
22.10.2016, 08:14  [ТС] 3
nmcf, не соглашусь! Почему один ? Выделяю два [0], [1]. Если закомментить функцию delete, то код компилируется и выполняется без ошибок
0
ValeryS
Модератор
7271 / 5525 / 692
Регистрация: 14.02.2011
Сообщений: 18,714
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
Viktor_Repin
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 23
Завершенные тесты: 1
22.10.2016, 08:23  [ТС] 5
Мммм, странно...в учебниках про это не пишут и я наивно полагал, что объектов два. То есть, если я заменю 1 на 2 то всё будет работать?
0
ValeryS
Модератор
7271 / 5525 / 692
Регистрация: 14.02.2011
Сообщений: 18,714
22.10.2016, 08:29 6
Цитата Сообщение от Viktor_Repin Посмотреть сообщение
То есть, если я заменю 1 на 2 то всё будет работать?
Да, будет
Цитата Сообщение от Viktor_Repin Посмотреть сообщение
в учебниках про это не пишут
почитай про массивы
1
Viktor_Repin
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 23
Завершенные тесты: 1
22.10.2016, 15:14  [ТС] 7
Спасибо Вам за совет! Попробую!

Добавлено через 5 часов 51 минуту
ValeryS, попробовал заменить 1 на 2...ничего не изменилось
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
22.10.2016, 15:21 8
Цитата Сообщение от Viktor_Repin Посмотреть сообщение
попробовал заменить 1 на 2...ничего не изменилось
Показывай.
0
Travelmate
11 / 11 / 7
Регистрация: 15.10.2012
Сообщений: 83
Завершенные тесты: 1
22.10.2016, 15:24 9
C++
1
std::cout << p[x] << std::endl;
и все работает
0
Selot
189 / 125 / 52
Регистрация: 19.01.2010
Сообщений: 508
Завершенные тесты: 2
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
Viktor_Repin
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 23
Завершенные тесты: 1
22.10.2016, 15:50  [ТС] 11
Хм...спасибо, буду пробовать! Что-то пока четкого понимания этого механизма не складывается
1
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
22.10.2016, 15:50 12
Можно ещё после цикла:
C++
1
p -= 2;
0
Viktor_Repin
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 23
Завершенные тесты: 1
22.10.2016, 16:38  [ТС] 13
nmcf, то есть вернуться к нулевому индексу?
Вроде все просто, но как запутанно
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
22.10.2016, 17:26 14
Очень запутанно...
0
nmcf
6274 / 5577 / 2537
Регистрация: 14.04.2014
Сообщений: 23,468
22.10.2016, 17:42 15
Лучший ответ Сообщение было отмечено Viktor_Repin как решение

Решение

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

Добавлено через 18 минут
учитывая, что код может быть весьма большим и не всегда есть возможность отследить когда был изменен индекс, есть ли способ автоматического возврата индекса к первоначальному?
0
ValeryS
Модератор
7271 / 5525 / 692
Регистрация: 14.02.2011
Сообщений: 18,714
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
23.10.2016, 19:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2016, 19:07

Динамическое выделение памяти
Пусть есть класс с полем char *p. Если для поля p выделяется память...

Динамическое выделение памяти
Дан такой код:#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; ...

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


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

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

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