Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Viktor_Repin
1 / 1 / 0
Регистрация: 26.08.2011
Сообщений: 23
Завершенные тесты: 1
#1

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

22.10.2016, 07:53. Просмотров 679. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамическое выделение памяти (C++):

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

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

Динамическое выделение памяти - C++
Выполнить задание используя динамическое выделение памяти: Данная целочисленная прямоугольная матрица. Определить: -количество строк,...

Динамическое выделение памяти. - C++
Доброго времени суток. Помогите, пожалуйста, решить задачу. Задача тривиальна - поиск и замена подстроки. Суть в чем: необходимо...

Динамическое выделение памяти - C++
есть код: int u = 0; char* mstrcat(char *str1, char *str2) { u = sizeof(str1); // *str1 = new char; char *res = str1; ...

Динамическое выделение памяти! - C++
Программа должна читать с клавы число и имя(до 15 символов). Данные должны вводится в одной функции а выводится во второй. Сохранять данные...

16
nmcf
5520 / 4830 / 1636
Регистрация: 14.04.2014
Сообщений: 19,608
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
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,186
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
Модератор
6707 / 5116 / 482
Регистрация: 14.02.2011
Сообщений: 17,186
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
5520 / 4830 / 1636
Регистрация: 14.04.2014
Сообщений: 19,608
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
172 / 108 / 28
Регистрация: 19.01.2010
Сообщений: 437
Завершенные тесты: 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
5520 / 4830 / 1636
Регистрация: 14.04.2014
Сообщений: 19,608
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
Эксперт С++
4887 / 3022 / 370
Регистрация: 10.11.2010
Сообщений: 11,080
Записей в блоге: 10
Завершенные тесты: 1
22.10.2016, 17:26 #14
Очень запутанно...
0
nmcf
5520 / 4830 / 1636
Регистрация: 14.04.2014
Сообщений: 19,608
22.10.2016, 17:42 #15
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Viktor_Repin, что запутано? Адрес должен быть тот, который выдан new.
1
22.10.2016, 17:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2016, 17:42
Привет! Вот еще темы с ответами:

Динамическое выделение памяти - C++
Имеется: #define Index 1000 typedef int BaseType; typedef BaseType TMemList; typedef unsigned ptrel; typedef struct List...

Динамическое выделение памяти - C++
Первый раз столкнулся с такой задачей... Дали лабораторную работу: Разработать приложения, реализующее следующие функции: 1) Выделяет...

Динамическое выделение памяти new - C++
Доброго времени. У меня в программе есть два двумерных динамических массива. Код компилируется, но возникает ошибка времени выполнения:...

динамическое выделение памяти - C++
дана целочисленная прямоугольная матрица. определить: 1) количество строк, не содержащих ни одного нулевого элемента; 2) максимальное...


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

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

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