Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 22.04.2009, 02:21   #1
liver1981
Пользователь
 
Регистрация: 25.03.2009
Сообщений: 20
По умолчанию Динамическая память

Господа, профессионалы!

Посмотрите, пожалста, этот код:

Код:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
void main()
{
	srand(unsigned (time(NULL)));
	int size;
	int * dar;
	// запрос размера массива с клавиатуры
	cout<<"Enter size:\n";
	cin>>size;
	//выделение памяти под массив с количеством элементов size
	dar=new int [size];
	if(!dar)////что это такое???
	{
		cout<<"Sorry, error!!!";
		exit(0);// функция организует выход из программы
	}
	// заполнение массива и показ на экран
	for(int i=0;i<size;i++)
	{
		dar[i]=rand()%100;
		cout<<dar[i]<<"\t";
	}
	cout<<"\n\n";
	// освобождение памяти
	delete[]dar;
}
Я просто в шоке, я не знаю, что обозначает в нём вот это выражение:

Код:
if(!dar)
	{
		cout<<"Sorry, error!!!";
		exit(0);// функция организует выход из программы
	}
Я пробовал без него и норм, работает.
Вот:

Код:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
void main()
{
	srand(unsigned (time(NULL)));
	int size;
	int * dar;
	// запрос размера массива с клавиатуры
	cout<<"Enter size:\n";
	cin>>size;
	//выделение памяти под массив с количеством элементов size
	dar=new int [size];
	
	// заполнение массива и показ на экран
	for(int i=0;i<size;i++)
	{
		dar[i]=rand()%100;
		cout<<dar[i]<<"\t";
	}
	cout<<"\n\n";
	// освобождение памяти
	delete[]dar;
}
А мне говорят что так кодить нельзя! Я чего то непонимаю, что это такое:

Код:
if(!dar)
	{
		cout<<"Sorry, error!!!";
		exit(0);// функция организует выход из программы
	}
Что это за непонятный зверь?)

Заранее спасибо!

Последний раз редактировалось liver1981; 22.04.2009 в 02:25. Причина: запарился)
liver1981 вне форума
Старый 22.04.2009, 02:55   #2
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Код:
f(!dar)
здесь наверно тот кто писал хотел проверить не дал ли оператор new сбой. Для старыйх компиляторов это нормально, но на более новыйх если оператор new не смог выделить память то он сгенерирует исключение
Код:
std::bad_alloc&
.
И этот код
Код:
dar=new int [size];
	if(!dar)////что это такое???
	{
		cout<<"Sorry, error!!!";
		exit(0);// функция организует выход из программы
	}
лучше переписать так
Код:
try{
    dar = new int[size];
}catch(std::bad_alloc&){
    cout<<"Error"<<endl;
    exit(0);
}
PS
Код:
if(!dar)
равносильно
Код:
if(dar==0)
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....

Последний раз редактировалось ISergeyN; 22.04.2009 в 02:57.
ISergeyN вне форума
Старый 22.04.2009, 03:07   #3
liver1981
Пользователь
 
Регистрация: 25.03.2009
Сообщений: 20
Радость

Спасибо, но извините, я новичок в С++ и мало что понял из того что Вы написали)

Т.е. единственное, то что пока что ясно так это то что, вот это:

Код:
if(!dar)
{
cout<<"Sorry, error!!!";
exit(0);// функция организует выход из программы
}
в данном коде можно и не писать, я так понял! праильно?

Т.е. вот так тоже праильно и всё, да?

Код:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
void main()
{
	srand(unsigned (time(NULL)));
	int size;
	int * dar;
	// запрос размера массива с клавиатуры
	cout<<"Enter size:\n";
	cin>>size;
	//выделение памяти под массив с количеством элементов size
	dar=new int [size];
	
	// заполнение массива и показ на экран
	for(int i=0;i<size;i++)
	{
		dar[i]=rand()%100;
		cout<<dar[i]<<"\t";
	}
	cout<<"\n\n";
	// освобождение памяти
	delete[]dar;
}
???
liver1981 вне форума
Старый 22.04.2009, 03:19   #4
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Ну вобщем да.Оно там и не нужно так как толку мало.
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума
Старый 22.04.2009, 04:13   #5
liver1981
Пользователь
 
Регистрация: 25.03.2009
Сообщений: 20
Радость

Цитата:
Сообщение от ISergeyN Посмотреть сообщение
Ну вобщем да.Оно там и не нужно так как толку мало.
ISergeyN, спасибо! Я пока ещё не знаю, что такое разроботка библиотек и как эти библиотеки влияют на мой код, но в сабже разобрался - спасибо, тебе!
liver1981 вне форума
Старый 22.04.2009, 09:16   #6
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

От него там толку может и не много, но оно обязательно нужно! Возможно не именно эта конструкция, но проверять динамически выделенную память всегда необходимо!
liver1981, когда вы динамически выделяете память, она не берется из воздуха, она выделяется из оперативной памяти компьютера. А теперь представьте, что будет, если этой памяти не хватит? Что должна сделать программа? Не ясно. Вот для этого и нужно проверять, все ли нормально с выделенной памятью. Как это происходит в данном случаи:
Код:
dar=new int [size];
	if(!dar)////что это такое???
	{
		cout<<"Sorry, error!!!";
		exit(0);// функция организует выход из программы
	}
Следующая строка
Код:
dar=new int [size];
должна выделить определенное количество памяти, и передать указатель на нее в "dar". Если данную память выделить невозможно, оператор new (в данном случаи) вернет 0 (null). Следовательно dar будет указывать на нулевой адрес памяти. Именно это и проверяется в условии
Код:
if(!dar)
Т.е. - "если dar указывает на 0, то..."
Далее должно быть все понятно.

Теперь по поводу исключений - оператор new действительно может генерировать исключение bad_alloc, вместо того, что бы возвращать null. Для этого нужно в начале программы написать:
Код:
#include <new>
Но, если вы не знакомы с механизмом исключений, делать этого не стоит! Старая добрая проверка на ноль замечательно работает.
И еще раз повторю, хоть на современных машинах и установлен достаточно большой объем оперативной памяти, проверять динамически выделенную память все равно необходимо. Не забывайте это делать при КАЖДОМ выделении (т.е. после каждого использования оператора new)
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическая память.Списки. Гвендолин Помощь студентам 6 31.03.2009 11:12
Текстовый редактор (динамическая память) quf Паскаль, Turbo Pascal, PascalABC.NET 2 21.04.2008 16:59
Динамическая память MadDog__ Помощь студентам 2 22.11.2007 00:05