1 / 1 / 0
Регистрация: 15.08.2014
Сообщений: 290
1

Подскажите, правильно ли работаю со ссылками и объектами

29.07.2021, 22:50. Показов 1378. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер!

Пишу процедуру, создающую сокет winsock и если все прошло успешно, он должен быть запомнен в некотором глобальном массиве (т.е. объявленном вне этой процедуры).
Код примерно такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
SOCKET s_array[10];
 
void create_socket {
   SOCKET s;
 
   // какие-то действия с сокетом...
 
   if (success) {
      // запоминаем сокет в массиве
      s_array[new_index] = s;
   }
 
 }
Вопрос:

1) где создается объект s ? Если я правильно понимаю, объект создается на стеке и он пропадет после выхода из create_socket и s_array[new_index] будет указывать неизвестно на что ?
В таком случае этот код неправилен.

2) или все же объект создается в хипе и тогда все нормално (по окончании процедуры он останется там) ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.07.2021, 22:50
Ответы с готовыми решениями:

Правильно ли я работаю с QTableWidget?
В общем, такой вопрос: мне нужно ввести в таблицу неск. цифр и потом по нажатию кнопки закрасить...

Правильно ли я работаю с QSharedPointer и QVBoxLayout
Правильно ли я работаю с QSharedPointer и QVBoxLayout, вот такой кусок кода: QSharedPointer <...

Подключаю мониторы с Video splitter и они работаю не правильно
Проблема такая : Проблема на данный момент : Подключаю сплиттер к видео карте и после этого -...

Правильно ли я работаю с классом для обмена данными меж формами
Здравствуйте. Для обмена данными между формами я создал класс и добавил в него переменных....

16
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
29.07.2021, 22:53 2
Цитата Сообщение от LUN2 Посмотреть сообщение
Если я правильно понимаю, объект создается на стеке и он пропадет после выхода из create_socket
Ага.

Цитата Сообщение от LUN2 Посмотреть сообщение
и s_array[new_index] будет указывать неизвестно на что ?
Вы его скопировали, в массиве будет копия дескриптора.
1
1 / 1 / 0
Регистрация: 15.08.2014
Сообщений: 290
29.07.2021, 23:19  [ТС] 3
Croessmah,

1) В смысле - я скопировал все содержимое структуры SOCKET s в массив (не ссылку) и выходит из процедуры уже не испортит это данные ?

2) А если бы SOCKET был объектом, то он бы не скопировался ? (только ссылка скопировалась бы) и такой код уже не подошел бы ?
0
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
30.07.2021, 04:13 4
Цитата Сообщение от LUN2 Посмотреть сообщение
А если бы SOCKET был объектом, то он бы не скопировался ?
SOCKET это просто число имеет тип int.
1
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
30.07.2021, 08:59 5
Цитата Сообщение от LUN2 Посмотреть сообщение
1) В смысле - я скопировал все содержимое структуры SOCKET s в массив (не ссылку) и выходит из процедуры уже не испортит это данные ?
Это просто некий идентификатор (дескриптор).
Если не ошибаюсь, под windows SOCKET - это HANDLE.
Считайте, что вы скопировали идентификатор в массив (считай, число).

Цитата Сообщение от LUN2 Посмотреть сообщение
А если бы SOCKET был объектом, то он бы не скопировался ? (только ссылка скопировалась бы) и такой код уже не подошел бы ?
Ничего не понял.
0
Just Do It!
3837 / 2283 / 636
Регистрация: 23.09.2014
Сообщений: 7,051
Записей в блоге: 2
30.07.2021, 14:54 6
Цитата Сообщение от LUN2 Посмотреть сообщение
SOCKET s_array[10];
можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
std::vector<SOCKET> socets;
 
void create_socket
{
   socets.push_back(SOCKET);
   SOCKET& s = socets.back(); /// чтобы обращаться в коде к последнему сокету через имя s.
 
   // какие-то действия с сокетом...
 
   if (success)
   {    ...
   }
   else
   {   socets.pop_back();
   }
 
 }
0
1 / 1 / 0
Регистрация: 15.08.2014
Сообщений: 290
30.07.2021, 21:04  [ТС] 7
stanislav, спасибо.
Я уже после вопроса полез смотреть его определение и тоже увидел это.
В таком случае мой вопрос (про - а если бы это был объект...) отпадает.

Добавлено через 35 минут
Цитата Сообщение от Croessmah Посмотреть сообщение


Цитата Сообщение от LUN2 Посмотреть сообщение
А если бы SOCKET был объектом, то он бы не скопировался ? (только ссылка скопировалась бы) и такой код уже не подошел бы ?
Это просто некий идентификатор (дескриптор).
Если не ошибаюсь, под windows SOCKET - это HANDLE.
Считайте, что вы скопировали идентификатор в массив (считай, число).

Ничего не понял.

Croessmah, на момент создания вопроса я не знал, что SOCKET - это число. С учетом этих знаний исх. вопрос отпадает.

Но задумывался он в таком ракурсе: если бы тип SOCKET не был примитивом, а был бы объектом , то правильно ли я понимаю, что такой объект, будучи создан в процедуре create_socket() через локальное объявление уничтожится при выходе из процедуры и подход к коду:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
SOCKET s_array[10];
 
void create_socket {
   SOCKET s;
 
   // какие-то действия с сокетом...
 
   if (success) {
      // запоминаем сокет в массиве
     [COLOR="Red"] s_array[new_index] = s;[/COLOR]
   }
 
 }
... будет неправильным - т.е. в массиве в красной строке сохранится ссылка на объект, который уничтожится при выходе ?
(т.е. за пределами этой процедуры я не смогу использовать элемент s_array[new_index] ?
0
фрилансер
5493 / 5090 / 1046
Регистрация: 11.10.2019
Сообщений: 13,314
30.07.2021, 21:47 8
LUN2, в массиве сохранится копия. Всё будет работать так же, как с HANDLE
2
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
30.07.2021, 21:51 9
Цитата Сообщение от LUN2 Посмотреть сообщение
т.е. в массиве в красной строке сохранится ссылка на объект, который уничтожится при выходе ?
Во-первых в языке С++ переменные примитивных типов - это тоже объекты.
Нет никакого смысла искуственно разделять их по этому признаку.
https://eel.is/c++draft/intro.object

Во-вторых, нет, ничего бы не изменилось, если бы SOCKET был классом. Вы копируете по значению.
3
1 / 1 / 0
Регистрация: 15.08.2014
Сообщений: 290
30.07.2021, 22:23  [ТС] 10
Всем спасибо!
0
2805 / 2315 / 701
Регистрация: 29.06.2020
Сообщений: 8,562
31.07.2021, 19:46 11
Цитата Сообщение от Алексей1153 Посмотреть сообщение
LUN2, в массиве сохранится копия. Всё будет работать так же, как с HANDLE
но лишь при условии что у класса сделанны операторы копирования, и возможно конструктор копирования.

Добавлено через 1 минуту
потому что если бы класс имел выделенные ресурсы не в стеке, все это(стандартное копирование ) было бы провалом

Добавлено через 1 минуту
ко всему еще и нужен коструктор без параметров

Добавлено через 52 секунды
Цитата Сообщение от DrOffset Посмотреть сообщение
Во-первых в языке С++ переменные примитивных типов - это тоже объекты.
вот с этим можно поспорить
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
31.07.2021, 20:27 12
Цитата Сообщение от SmallEvil Посмотреть сообщение
вот с этим можно поспорить
Нельзя.
0
2805 / 2315 / 701
Регистрация: 29.06.2020
Сообщений: 8,562
31.07.2021, 20:30 13
DrOffset, с какого стандарта нельзя ?
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
31.07.2021, 20:30 14
SmallEvil, с любого.
0
2805 / 2315 / 701
Регистрация: 29.06.2020
Сообщений: 8,562
31.07.2021, 20:35 15
DrOffset, изучу вопрос позже, но насколько мне известно, встроенные типы так и называются что тделяются от пользовательских подходом и оптимизацие, и они точно не классы, уже стыкался в шаблонах,
где template<class T>
встроенный тип не пройдет, и он точно явно отличается от любого класса, спорить не буду просто изучу.

если дадите инфу не на английском, буду благодарен
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
31.07.2021, 20:46 16
Цитата Сообщение от SmallEvil Посмотреть сообщение
и они точно не классы,
Никто не говорил, что они классы.

Цитата Сообщение от SmallEvil Посмотреть сообщение
если дадите инфу не на английском
Так не пойдет. Могу дать скриншот оригинального стандарта C++ 1998. В последующих стандартах в этом аспекте ничего не изменилось.
Подскажите, правильно ли работаю со ссылками и объектами
0
2805 / 2315 / 701
Регистрация: 29.06.2020
Сообщений: 8,562
01.08.2021, 05:08 17
Цитата Сообщение от DrOffset Посмотреть сообщение
Никто не говорил, что они классы.
Цитата Сообщение от DrOffset Посмотреть сообщение
Во-первых в языке С++ переменные примитивных типов - это тоже объекты.
извиняюсь

Добавлено через 46 секунд
то что встроенные типы объекты нет никаких сомнений
0
01.08.2021, 05:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.08.2021, 05:08
Помогаю со студенческими работами здесь

Подскажите с ссылками
есть ссылка вида &lt;a href=&quot;http://localhost/photo.html?http://localhost/image.jpj&quot;&gt;Фото&lt;/a&gt; ...

Как правильно меняться ссылками?
слышал что обмен ссылок повышает тиц, но как сделать это так, чтоб хорошо поднялся? у меня щас...

Как правильно меняться ссылками???
Глупый ,конечно,вопрос,но все же. Почитав форум, у меня получилось что : 1. на продвигаемом сайте...

И как же правильно обмениваться ссылками?
Посмотрел темы на счет ссылок... Не нашел ту, как реагирует яша на счет обмена ссылками типа &quot;сайт1...

Как правильно отправить сообщение со ссылками
Добрый день В базе есть поля со ссылками на 3 вида ресурсов. Необходимо чтоб делалась выборка по...

Как правильно организовать обмен ссылками
Как правильно организовать обмен ссылками с технической стороны. Есть ли альтернатива каталогу...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru