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

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

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2008, 10:56   #1
eks-s
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 64
По умолчанию Возникает исключение при TStream.Free

Здравствуйте! Подскажите почему возникает исключение в 22й строчке при уничтожении потока, что не верно?

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  FStream := nil;
end;

procedure TForm1.ButtonServerClick(Sender: TObject);
begin
  ServerSocket.Active := True;
end;

procedure TForm1.ButtonSendClick(Sender: TObject);
begin
  FStream := TFileStream.Create('C:\test.doc', fmOpenRead or fmShareDenyWrite);
  ServerSocket.Socket.Connections[0].SendStream(FStream);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if Assigned(FStream) then
    begin
      FStream.free;
      FStream := nil;
    end;
end;
eks-s вне форума Ответить с цитированием
Старый 06.03.2008, 11:05   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

А вы трасировкой пройдитесь и посомтрите.
Скорей всего удаляется не созданный объект
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 07.03.2008, 00:29   #3
eks-s
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 64
По умолчанию

Цитата:
Сообщение от Квэнди Посмотреть сообщение
А вы трасировкой пройдитесь и посомтрите.
Скорей всего удаляется не созданный объект
Но он ведь в ButtonSendClick создаётся. Или после SendStream(FStream) он сам уничтожается?
eks-s вне форума Ответить с цитированием
Старый 07.03.2008, 00:34   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

22-я строчка это не уничтожение объекта, а попытка присвоить nil объекту, который, в чём я практически уверен, не является указателем. Как Вы себе представляете такое действие?
B_N вне форума Ответить с цитированием
Старый 07.03.2008, 08:34   #5
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Мда, извиняюсь, засмотрелся на нумерацию строк.
FStream.free;
FStream := nil;
никакого смысла не несет, используйте free
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 07.03.2008, 09:53   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

возможно ошибка не в удалении потока, а в том, что его кто-то использует еще, а мы его удаляем, т.к. вроде код правильно написан
pu4koff вне форума Ответить с цитированием
Старый 07.03.2008, 09:56   #7
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

какая разница используется объект или нет ? ответ прост:
смотря что считать 22-й строкой:
если FStream.free; то ошибка скорее всего вызвана отсутствием объекта
если
FStream := nil; то ошибка присвоения пустому месту
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 07.03.2008, 10:03   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

а Assigned(FStream) по Вашему что делает? случаем не проверяет на наличие объекта?
pu4koff вне форума Ответить с цитированием
Старый 07.03.2008, 10:05   #9
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

2Алексей eks-s
ошибка все-таки из -за того, что поток уничтожается в SendStream.
Вот часть кода VCL:

Код:

  procedure DropStream;
  begin
    if FDropAfterSend then Disconnect(FSocket);
    FDropAfterSend := False;
    FSendStream.Free;
    FSendStream := nil;
  end;
Поэтому в FormDestroy уничтожение уже не существующего объекта.

2Квэнди
Не понял фразу:
FStream := nil; то ошибка присвоения пустому месту

В этой строке никогда не будет ошибки в run-time.

Последний раз редактировалось alexBlack; 07.03.2008 в 10:11.
alexBlack вне форума Ответить с цитированием
Старый 07.03.2008, 10:16   #10
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Цитата:
Сообщение от alexBlack Посмотреть сообщение
2Алексей eks-s
ошибка все-таки из -за того, что поток уничтожается в SendStream.
Вот часть кода VCL:

Код:

  procedure DropStream;
  begin
    if FDropAfterSend then Disconnect(FSocket);
    FDropAfterSend := False;
    FSendStream.Free;
    FSendStream := nil;
  end;
Поэтому в FormDestroy уничтожение уже не существующего объекта.

2Квэнди
Не понял фразу:
FStream := nil; то ошибка присвоения пустому месту

В этой строке никогда не будет ошибки в run-time.
Пардон, последствия утра ерунду написал
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мой плеер. Возникает ошибка Fellics{новичок} Помощь студентам 8 26.06.2008 20:11
Возникает проблема с решением задачи. profi Помощь студентам 2 30.11.2007 01:11
Возникает ошибка Invalid floating point operation Иринкаа Помощь студентам 3 29.11.2007 22:10
Помогите с получением TStream в CGI boades Работа с сетью в Delphi 0 25.10.2007 10:25
Возникает исключение "Access violation at address ... Наташка Общие вопросы Delphi 1 18.05.2007 12:16