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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
vdvoid
3 / 3 / 0
Регистрация: 26.02.2011
Сообщений: 99
01.04.2013, 12:50     удаление указателя #1
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;
как правильно?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
01.04.2013, 15:40     удаление указателя #21
Еще от ОС зависит.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.04.2013, 15:52     удаление указателя #22
Цитата Сообщение от Vourhey Посмотреть сообщение
Еще от ОС зависит.
Ага, не сказал, что дело было под Linux. Под виндой вроде есть ограничение что-то около 17ГБ на процесс.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.04.2013, 16:18     удаление указателя #23
Цитата Сообщение от Kastaneda Посмотреть сообщение
Я сначала вообще офигел, как на машине с 16ГБ ОЗУ спокойно выделяется 1ТБ
Не очень понял. Т.е. 1ТБ своп создался на диске?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.04.2013, 17:49     удаление указателя #24
Цитата Сообщение от Tulosba Посмотреть сообщение
Не очень понял. Т.е. 1ТБ своп создался на диске?
Нет, на самом деле выделяется виртуальное адресное пространство, которое в 64 битных системах очень большое. Поэтому можно выделить хоть 1000 ТБ, оно успешно выделится (в Linux). Проблемы начнутся при записи в эту память, когда окажется, что выделенная память на самом деле физически не существует.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
01.04.2013, 18:52     удаление указателя #25
Цитата Сообщение от Kastaneda Посмотреть сообщение
Проблемы начнутся при записи в эту память
А при чтении не начнутся? Вообще, конечно, хотелось бы знать, что память доступна для дальнейших действий (чтение,запись), а то что при "успешном" выделении ничего полезного сделать нельзя это только оттягивает ошибку.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.04.2013, 20:09     удаление указателя #26
Цитата Сообщение от Tulosba Посмотреть сообщение
А при чтении не начнутся?
Ну да, имелось ввиду при доступе к памяти.
Цитата Сообщение от Tulosba Посмотреть сообщение
а то что при "успешном" выделении ничего полезного сделать нельзя это только оттягивает ошибку
Да, так и есть. Ну обычно же память выделяется непосредственно перед использованием, поэтому ошибка обнаруживается практически сразу. Просто надо иметь ввиду, что такое поведение возможно.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.04.2013, 07:59     удаление указателя #27
Цитата Сообщение от Kastaneda Посмотреть сообщение
Ну да, имелось ввиду при доступе к памяти.

Да, так и есть. Ну обычно же память выделяется непосредственно перед использованием, поэтому ошибка обнаруживается практически сразу. Просто надо иметь ввиду, что такое поведение возможно.
Можно пример, когда new отработал без ошибок, а доступ к "выделенной" памяти кинул ошибку?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 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 по таймауту отваливается, поэтому проверить не могу.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.04.2013, 12:01     удаление указателя #29
Цитата Сообщение от Kastaneda Посмотреть сообщение
выдеяем 10 терабайт, все работает
У меня в виртуалке на убунте грохнулось на первой же итерации. Видимо блока в 1Гб не удалось найти.
Если размеры поменять, т.е. увеличить кол-во циклов и уменьшить объём, выделяемый на итерации, оставив общий в 10Тб, то отработало.
При этом при записи потом действительно возникают ошибки. Прога вываливается с сообщением "Killed".
Если честно, хотелось бы найти описание такого поведения для выделения памяти в стандарте.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.04.2013, 12:05     удаление указателя #30
Tulosba, В каком стандарте? Память выделяет ОС и как она ее выделяет - это ее дело, а не дело С++.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.04.2013, 12:13     удаление указателя #31
ForEveR, C++11 5.3.4 New. В частности там же говорится про, например, bad_alloc. Имхо, поведение, когда память выделена "успешно", а использовать её нельзя, мне кажется нелогичным.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2013, 12:29     удаление указателя
Еще ссылки по теме:

Удаление указателя на матрицу C++
Удаление указателя C++
Удаление указателя, в классе не содержащем объекта C++

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

Или воспользуйтесь поиском по форуму:
RussDragon
02.04.2013, 12:29     удаление указателя
  #32

Не по теме:

Вот из-за таких преподавателей и не надо идти на программиста, а идти на какой-нибудь физ-мат( Кто потянет ) и изучать программирование самостоятельно

Yandex
Объявления
02.04.2013, 12:29     удаление указателя
Ответ Создать тему
Опции темы

Текущее время: 06:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru