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

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

Войти
Регистрация
Восстановить пароль
 
breate
56 / 56 / 2
Регистрация: 23.10.2009
Сообщений: 250
#1

почему сыпится delete? - C++

26.10.2009, 18:02. Просмотров 526. Ответов 7
Метки нет (Все метки)

кто подсткажет почему сыпится delete и delete [] тоже
C++
1
2
3
4
5
6
7
class addres{
private:
char *street;
int home[3];
public:
addres();
~addres();
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
istream & operator >>(istream &is,addres &ad)
{
int i=1;
char a[20];
is>>a;
for(;a[i]!=NULL;i++);
if(ad.street!=NULL) 
delete ad.street;
ad.street = new char[i];
for(int j=0;j<=i;j++)
        ad.street[j]=a[j];
is>>ad.home[0];
is>>ad.home[1];
is>>ad.home[2];
return is;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2009, 18:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос почему сыпится delete? (C++):

Почему вылетает программа на delete [] - C++
Здравствуйте, подскажите, пожалуйста, что именно не так и как исправить. Программа вылетает сразу же на деструкторе,т.е на delete . Хотя,...

почему не delete (выделение памяти) - C++
почему в примерах в мсдне не высвобождается память после использования asctime, ctime? #include &lt;time.h&gt; #include &lt;stdio.h&gt; int...

Почему delete не устанавливает автоматически указатель в NULL? - C++
Почему delete не устанавливает автоматически указатель в NULL?

Динамический массив структур. Почему данные доступны после выполнения операции delete [] - C++
Всем привет! Выполнил вот такое задание. После того как вывелись данные трех структур, очищаю выделенную область памяти оператором delete...

В чем разница между delete и delete[]? - C++
а можете еще по подробней рассказать про delete, точнее даже delete, чем именно отличается delete от delete, т.к. я попробовал...

Почему при выполнении оператора delete возникает ошибка "program.exe has triggered a breakpoint"? - C++
class test { public: void a() { std::cout &lt;&lt; &quot;test::a&quot; &lt;&lt; std::endl; } }; class test2 : public test { public: ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
26.10.2009, 18:10 #2
кто подсткажет почему сыпится delete и delete [] тоже
попытка освобождения неинициализированного указателя
0
breate
56 / 56 / 2
Регистрация: 23.10.2009
Сообщений: 250
26.10.2009, 18:15  [ТС] #3
Цитата Сообщение от Rififi Посмотреть сообщение
попытка освобождения неинициализированного указателя
не понял?
C++
1
2
if(ad.street!=NULL) 
delete ad.street;
на момент входа когда сыпется объект ad имеет все заполненные поля, по мойму он инициализирован или я чего то недоперепонимаю?
0
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
26.10.2009, 18:16 #4
на момент входа ...
... у тебя в ad.street мусор
0
blackswan
12 / 12 / 0
Регистрация: 08.07.2009
Сообщений: 61
26.10.2009, 18:18 #5
breate,
if(ad.street!=NULL) - это не означает, что объекту наверняка выделена память, даже если не NULL, указатель может принимать произвольное значение.
0
breate
56 / 56 / 2
Регистрация: 23.10.2009
Сообщений: 250
26.10.2009, 18:48  [ТС] #6
ааа вот конструктор по умолчанию
C++
1
2
3
4
addres::addres(){
street=NULL;
home[1]=home[2]=home[0]=0;
}
на момент входа в ad.street находится строка заканчивающаяся нулём хотя сейчас ноль проверю

в хедере ещё ;
C++
1
#define NULL 0
Добавлено через 6 минут
всё нашел ошибку
я не дощитывался одного элемента
C++
1
2
for(;a[i]!=NULL;i++);
if(ad.street!=NULL)
у меня нуль проваливался

Добавлено через 12 минут
почему 0 проваливается?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
istream & operator >>(istream &is,addres &ad)
{
int i=1;
char a[20];
is>>a;
for(;a[i-1]!=NULL;i++);
if(ad.street!=NULL) 
delete [] ad.street;
ad.street = new char[i+1];
for(int j=0;j<=i;j++)
        ad.street[j]=a[j];
is>>ad.home[0];
is>>ad.home[1];
is>>ad.home[2];
return is;
}
этот код работает единственное отличие это
C++
1
ad.street = new char[i+1];
недоперепонял?
0
easybudda
Модератор
Эксперт CЭксперт С++
9623 / 5571 / 946
Регистрация: 25.07.2009
Сообщений: 10,697
26.10.2009, 18:50 #7
char a[20] - это массив символов типа char, а нумерация элементов массива с 0 начинается (у Вас int i = 1)...
Кстати, раз уж на с++ пишите, в чём глубинный смысл использования строк в стиле с? Чем Вам std::string не угодил?
0
breate
56 / 56 / 2
Регистрация: 23.10.2009
Сообщений: 250
26.10.2009, 18:55  [ТС] #8
гы, по а я начинаю бегать с [i-1] до a[i-1]!=NULL следовательно i уже включат строку a и NULL а во втором цикле я намеренно его копирую (j=0; j<=i;j++)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2009, 18:55
Привет! Вот еще темы с ответами:

Чем отличается delete[] от delete? - C++
чем отличается? delete mas от delete mas

delete[] *pointer vs. delete pointer и утечка памяти - C++
Здравствуйте! Есть класс &quot;умного&quot; указателя counted_ptr, который удаляет хранящийся в нём T* owned; только если кол-во владельцев...

"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"? - C++
Я правильно понимаю, что &quot;delete a, b;&quot; эквивалентно &quot;delete a; delete b;&quot; ?

delete this - C++
Какие последствия могут быть при выполнении команды delete this; из какой-нибудь функции члена?


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

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

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