powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите найти разницу
25 сообщений из 26, страница 1 из 2
Помогите найти разницу
    #34490334
Busya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Builder C++ 6.0
В программе использую Socket. При сбое в сети не получалось восстановить коннект, выдавалась ошибка Win API. Поэтому сделала при ошибке пересоздание Socket-а:

TClientSocket *temp = ClientSocket1;
ClientSocket1 = new TClientSocket(temp->Owner);
ClientSocket1->Active = false;
ClientSocket1->ClientType = temp->ClientType;
ClientSocket1->Address = temp->Address;
ClientSocket1->Port = temp->Port;
ClientSocket1->OnConnect = ClientSocket1Connect;
ClientSocket1->OnDisconnect = ClientSocket1Disconnect;
ClientSocket1->OnRead = ClientSocket1Read;
ClientSocket1->OnError = ClientSocket1Error;
delete temp;

Но при первом же обращении к ClientSocket1 программа вылетала с Access Violation, такое ощущение, что при delete уничтожался и новый сокет.

Тогда переделала:

TClientSocket *temp;
temp = new TClientSocket(ClientSocket1->Owner);
temp->Active = false;
temp->ClientType = ClientSocket1->ClientType;
temp->Address = ClientSocket1->Address;
temp->Port = ClientSocket1->Port;
temp->OnConnect = ClientSocket1Connect;
temp->OnDisconnect = ClientSocket1Disconnect;
temp->OnRead = ClientSocket1Read;
temp->OnError = ClientSocket1Error;
delete ClientSocket1;
ClientSocket1 = temp;

Теперь все работает. В общем-то и вопроса нет, но осадок остался. На мой взгляд я делаю в обоих случаях абсолютно одно и то же, так почему же в первом случае не работает?

Буся
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34490670
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не одно и тоже. По второму варианту вопросов нет.
В первом варианте после выполнения первой строки
Busya
TClientSocket *temp = ClientSocket1;

в переменых ClientSocket1 и temp содержится одинаковый адрес.
В последней строке первого варианта
Busya
delete temp;

уничтожается объект по адресу ClientSocket1, который только что проинициализирован, поэтому и Access Violation.

ИМХО. По-моему, непрочитан раздел "Указатели" из учебника по "С".
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34490681
Busya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я вообще то считала, что в следующей строке первого варианта
ClientSocket1 = new TClientSocket(temp->Owner);
в ClientSocket1 заносится новый адрес, а в temp остается старый
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34490690
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BusyaЯ вообще то считала, что в следующей строке первого варианта
ClientSocket1 = new TClientSocket(temp->Owner);
в ClientSocket1 заносится новый адрес, а в temp остается старый

Ты права, а pirovindos - нет.
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34490694
Busya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может и права, а на деле первый вариант не работает :)
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34490739
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотри в дебуге, что не так работает.
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34490765
Busya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Следующая строчка текста:

if (ClientSocket1->Active)

Вот на ней и вылетает в первом варианте по EAccessViolation
А во втором варианте все в порядке
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34490817
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да ты не на строчку смотри, ты на данные смотри.
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34490951
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А точно ClientSocket1 имеет тип TClientSocket*?
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34491205
Busya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Точно.
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34491206
Busya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а дебагить сервис как-то не в кайф.
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34491498
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Busyaа дебагить сервис как-то не в кайфне стал бы я в сервисе использовать T*Socket. Сам использую synapse - доволен безмерно :)
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34492954
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BusyaЯ вообще то считала, что в следующей строке первого варианта
ClientSocket1 = new TClientSocket(temp->Owner);
в ClientSocket1 заносится новый адрес, а в temp остается старый

Да. Признаю, облажался. В упор не видел строчки с new. Видно к концу рабочего дня читать исходники уже не могу.
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34493235
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли узнать у автора где и как объявлен ClientSocket1?
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34493412
Busya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ClientService1 объявлен в DataModule, созданном при разработке, не в runtime
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34493483
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть предположение: во время исполнения кода первого варианта. например, между n-ей и n+1-ой строкой происходит событие, которое требует обработки, и тогда прерывается исполнение этого кода и начинается исполнения другого куска кода, где есть обращение к переменной ClientSocket1, еще не проинициализированной до конца и ... - результат непредсказуем.

Версия слабенкая так как, тогда:
1. Падать должна в другом месте.
2. Падать должно иногда, а не всегда.
2. Может упасть и при 2-ом варианте.
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34493501
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
настаиваю на дебуге. Если не можешь дебуг, смотри асмовый код.
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34493510
Busya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак, поясняю. Я вставила печать в файл между каждыми строчками этого проклятого кода. После процитированного куска идет следующее "if (ClientSocket1->Active)", естественно перед иф-ом была вставлена печать. В этом иф-е (он заметим без элса) первой строчкой опять же вставлена была печать. И после иф-а тоже тут же была вставлена печать. Итак печать перед ифом срабатывала, а в иф-е, и тем более после иф-а нет. Так что вопросов никаких - вылетало именно при чтении проперти ClientSocket1->Active. Еще варианты?
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34493529
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не красавица, так не пойдет. Надо в дебуггере стучать. Если память сломала, то печатью ошибку только вглубь загонишь. Причем не факт, что память сломалась на пересоздании сокета, может и в километре от этого места
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34493555
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
TClientSocket *temp = ClientSocket1;
FILE *log=fopen("log.txt","a");
fprintf(log,"1: %p %p\n",temp,ClientSocket1);
ClientSocket1 = new TClientSocket(temp->Owner);
fprintf(log,"2: %p %p\n",temp,ClientSocket1);
ClientSocket1->Active = false;
ClientSocket1->ClientType = temp->ClientType;
ClientSocket1->Address = temp->Address;
ClientSocket1->Port = temp->Port;
ClientSocket1->OnConnect = ClientSocket1Connect;
ClientSocket1->OnDisconnect = ClientSocket1Disconnect;
ClientSocket1->OnRead = ClientSocket1Read;
ClientSocket1->OnError = ClientSocket1Error;
fprintf(log,"3: %p %p\n",temp,ClientSocket1);
delete temp;
fprintf(log,"4: %p %p\n",temp,ClientSocket1);
fclose(log);
а если так?
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34493568
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде клиентсокет, в неблокирущем варианте, поток запускает для обмена данными ... может там чего ...
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34493883
Busya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень хорошая идея распечатать адреса, как-то не подумала, итак (первый temp, второй ClientSocket1):

после TClientSocket *temp = ClientSocket1;
1: 009E88A8 009E88A8

после ClientSocket1 = new TClientSocket(temp->Owner);
2: 009E88A8 00A08DE4

перед delete temp;
3: 009E88A8 00A08DE4

после delete temp;
4: 009E88A8 00000000

Нонсенс
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34494068
Busya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Слушайте, я провела эксперимент, итак, чистая форма, кнопка и сокет, вот дфм:
object Form1: TForm1
Left = 192
Top = 107
Width = 696
Height = 480
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 296
Top = 120
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 0
OnClick = Button1Click
end
object ClientSocket1: TClientSocket
Active = False
ClientType = ctNonBlocking
Port = 0
Left = 112
Top = 32
end
end

Вот текст на кнопку:
TClientSocket *temp = ClientSocket1;
FILE *log=fopen("c:\\log.txt","a");
fprintf(log,"1: %p %p\n",temp,ClientSocket1);
ClientSocket1 = new TClientSocket(temp->Owner);
fprintf(log,"2: %p %p\n",temp,ClientSocket1);
ClientSocket1->Active = false;
ClientSocket1->ClientType = temp->ClientType;
ClientSocket1->Address = temp->Address;
ClientSocket1->Port = temp->Port;
fprintf(log,"3: %p %p\n",temp,ClientSocket1);
delete temp;
fprintf(log,"4: %p %p\n",temp,ClientSocket1);
fclose(log);

Все больше ничего. И вот содержимое полученного файла:
1: 00BC6E30 00BC6E30
2: 00BC6E30 00BC723C
3: 00BC6E30 00BC723C
4: 00BC6E30 00000000

Версия С: Enterprise 6.0 Build 10.166
Windows 2000 Build 2195 SP4

Может для интереса проверите?
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34494135
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Busya B> Версия С: Enterprise 6.0 Build 10.166
B> Windows 2000 Build 2195 SP4на 5-ке тоже самое

если в отладчике провалиться внутрь delete temp, то видим вот что:
Код: plaintext
1.
2.
3.
4.
5.
6.
 procedure  TComponent.RemoveComponent(AComponent: TComponent);
 begin 
  ValidateRename(AComponent, AComponent.FName, '');
  Notification(AComponent, opRemove);
  AComponent.SetReference(False);
  Remove(AComponent);
 end ;
я думаю, тут собака зарыта
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Помогите найти разницу
    #34495024
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, что объект по адресу ClientSocket1 создается а OnCreate функции формы. Ведь в прикладном коде нигде нет выделение памяти по ClientSocket1. И целостность указателей на элементы формы, видимо, отслеживает борландовская библиотека. Которая и обнуляет ClientSocket1.
Например, если поставить печать после delete ClientSocket1 в первом варианте тоже 0 в адресе получится или нет?
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите найти разницу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]