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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
vdvoid
3 / 3 / 0
Регистрация: 26.02.2011
Сообщений: 99
#1

удаление указателя - C++

01.04.2013, 12:50. Просмотров 1345. Ответов 31
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
char* func() {
    char *str = new char[100];
    strcpy(str, "I am string!");
    return str;
}
.. далее
char *a;
a = func();
delete[] a;
или 
delete a;
как правильно?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2013, 12:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос удаление указателя (C++):

Удаление указателя - C++
Доброго времени суток! Возник вопрос: безопасно ли таким способом удалять указатели? std::vector<MyClass*> vec; //создание ...

Удаление указателя на матрицу - C++
Здравтвуйте есть фу-я удаления матрицы void DeleteMatrix(double **obj) { for (int i = 0; i < n; i++) { delete...

Удаление указателя на объект класса - C++
Что-то ни как не могу разобраться, где у меня ошибка?! Ниже приведен фрагмент кода: //... shapes *ptr=0; //ptr - указатель базового...

Удаление и создание указателя в игре - C++
Добрый вечер. Долгое время сижу с кодом, не придет в голову: Нужно, чтобы при пересечении на тайлмапе координат игрока/64 и символа 'b'...

Удаление указателя, в классе не содержащем объекта - C++
Подскажите, в классе объявляю указатель на объект, сам объект создан в не этого класса, вопрос - нужно ли удалять указатель на этот объект...

Почему увеличение указателя на sizeof(тип) не тождественно инкременту этого же указателя? - C++
Всем доброго дня.:) Можете обьяснить ,почему при инкриментировании указателя,его значение(адресс) увеличивается на 4 (размер int в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
01.04.2013, 13:24 #16
Цитата Сообщение от Vourhey Посмотреть сообщение
не продолжай, а то ты бедного автора темы дезинформируешь перлами своего преподавателя. А ваш препод, случайно, ПО для спутников ГЛОНАСС не кодит?

Не по теме:

нет, но у всей нашей группы, и не только нашей, сложилось впечатление, что она кодит zumu по ночам, а днем на парах, усердно бета-тестит её нонстоп в гордом одиночестве

0
Tulosba
01.04.2013, 14:39
  #17

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
На самом деле печально, что такие люди работают преподавателями...
Ну, не факт, что дело в преподавателе. Есть такой избитый прием: рассказывать о проблемах гипотетического друга, подразумевая фактически себя.

0
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
01.04.2013, 14:42 #18
Цитата Сообщение от Tulosba Посмотреть сообщение

Не по теме:


Ну, не факт, что дело в преподавателе. Есть такой избитый прием: рассказывать о проблемах гипотетического друга, подразумевая фактически себя.

Не по теме:


я лучше промолчу, чем буду нести чушь, которую не знаю.
я действительно не знаю, зачем удалять за собой память, и не удаляю, т.к. мне ни разу это еще не навредило, но, я не призываю к этому других.

0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
01.04.2013, 15:02 #19
Цитата Сообщение от Tiva Посмотреть сообщение
я действительно не знаю, зачем удалять за собой память,
Это же не культурно - мусорить. Да и погрязнуть можно в этом ворохе.
Вот Вам программа для понимания:
C++
1
2
3
4
5
6
7
int main () {
   for(;;) {
      int *p = new int [1000000];
      delete [] p; // Без этой строки программа быстренько упадет, а с ней - будет работать вечно.
   }
   return 0;
}
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
01.04.2013, 15:05 #20
Цитата Сообщение от Tulosba Посмотреть сообщение
Это же не культурно - мусорить. Да и погрязнуть можно в этом ворохе.
Вот Вам программа для понимания:
C++
1
2
3
4
5
6
7
int main () {
   for(;;) {
      int *p = new int [1000000];
      delete [] p; // Без этой строки программа быстренько упадет, а с ней - будет работать вечно.
   }
   return 0;
}
недавно наткнулся - на 64битной ОС этот код упадет совсем не быстренько, в независимости от того, сколько ОЗУ на машине. Он будет выделять и выделять память, пока не закончится виртуальное адресное пространство, а это 2^64 - 1 байт, т.е. ооочень много.
Я сначала вообще офигел, как на машине с 16ГБ ОЗУ спокойно выделяется 1ТБ, но потом разобрался что к чему
0
Vourhey
Почетный модератор
6481 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
01.04.2013, 15:40 #21
Еще от ОС зависит.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
01.04.2013, 15:52 #22
Цитата Сообщение от Vourhey Посмотреть сообщение
Еще от ОС зависит.
Ага, не сказал, что дело было под Linux. Под виндой вроде есть ограничение что-то около 17ГБ на процесс.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
01.04.2013, 16:18 #23
Цитата Сообщение от Kastaneda Посмотреть сообщение
Я сначала вообще офигел, как на машине с 16ГБ ОЗУ спокойно выделяется 1ТБ
Не очень понял. Т.е. 1ТБ своп создался на диске?
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
01.04.2013, 17:49 #24
Цитата Сообщение от Tulosba Посмотреть сообщение
Не очень понял. Т.е. 1ТБ своп создался на диске?
Нет, на самом деле выделяется виртуальное адресное пространство, которое в 64 битных системах очень большое. Поэтому можно выделить хоть 1000 ТБ, оно успешно выделится (в Linux). Проблемы начнутся при записи в эту память, когда окажется, что выделенная память на самом деле физически не существует.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
01.04.2013, 18:52 #25
Цитата Сообщение от Kastaneda Посмотреть сообщение
Проблемы начнутся при записи в эту память
А при чтении не начнутся? Вообще, конечно, хотелось бы знать, что память доступна для дальнейших действий (чтение,запись), а то что при "успешном" выделении ничего полезного сделать нельзя это только оттягивает ошибку.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
01.04.2013, 20:09 #26
Цитата Сообщение от Tulosba Посмотреть сообщение
А при чтении не начнутся?
Ну да, имелось ввиду при доступе к памяти.
Цитата Сообщение от Tulosba Посмотреть сообщение
а то что при "успешном" выделении ничего полезного сделать нельзя это только оттягивает ошибку
Да, так и есть. Ну обычно же память выделяется непосредственно перед использованием, поэтому ошибка обнаруживается практически сразу. Просто надо иметь ввиду, что такое поведение возможно.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
02.04.2013, 07:59 #27
Цитата Сообщение от Kastaneda Посмотреть сообщение
Ну да, имелось ввиду при доступе к памяти.

Да, так и есть. Ну обычно же память выделяется непосредственно перед использованием, поэтому ошибка обнаруживается практически сразу. Просто надо иметь ввиду, что такое поведение возможно.
Можно пример, когда new отработал без ошибок, а доступ к "выделенной" памяти кинул ошибку?
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
02.04.2013, 09:12 #28
Цитата Сообщение от Tulosba Посмотреть сообщение
Можно пример, когда new отработал без ошибок, а доступ к "выделенной" памяти кинул ошибку?
У меня под рукой 64 битной ОС нету, но например вот
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
int main()
{
   try {
      for (int i = 0; i < 10 * 1024; i++) {  // 10 Tb
         int *ptr = new int [1024 * 1024 * 1024];
      }
   } catch (...) {
      std::cout << "Exception" << std::endl;
   }
   
   return 0;
}
выдеяем 10 терабайт, все работает http://liveworkspace.org/code/3PGgLE$0

Чтоб упало, нужно попробовать что-нибудь писать в эту память, но LWS по таймауту отваливается, поэтому проверить не могу.
1
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
02.04.2013, 12:01 #29
Цитата Сообщение от Kastaneda Посмотреть сообщение
выдеяем 10 терабайт, все работает
У меня в виртуалке на убунте грохнулось на первой же итерации. Видимо блока в 1Гб не удалось найти.
Если размеры поменять, т.е. увеличить кол-во циклов и уменьшить объём, выделяемый на итерации, оставив общий в 10Тб, то отработало.
При этом при записи потом действительно возникают ошибки. Прога вываливается с сообщением "Killed".
Если честно, хотелось бы найти описание такого поведения для выделения памяти в стандарте.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
02.04.2013, 12:05 #30
Tulosba, В каком стандарте? Память выделяет ОС и как она ее выделяет - это ее дело, а не дело С++.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2013, 12:05
Привет! Вот еще темы с ответами:

Преобразование кода без указателя в код с использованием указателя - C++
Правильно ли выполнил? Исходный код без указателя #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;fstream&gt; using namespace...

Как сделать функцию от указателя на класс и указателя на метод? - C++
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод. Обращаться к классу нужно именно по указателю,...

В чём отличие константного указателя и указателя на константу? - C++
int *const p1 и int const* p2 Объясните мне в чём тут отличие.

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... - C++
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.04.2013, 12:05
Ответ Создать тему
Опции темы

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