Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Тестирую сервер запуская в двух потоках создание клиентов в цикле - пока по 150 клиентов в каждом. Клиенты подключаются и посылают данные серверу. Сервер принимает данные, обрабатывает и сохраняет их в базу (postgresql), создавая подключения к базе для каждого клиента и разрывая его по выполнению запроса. Работает такая схема у меня по разному: 1) Запустил сервер, запустил циклы с клиентами - все 300 выполняются; 2) Запустил сервер, запустил циклы - первый раз выполнятся все 300, при втором запуске выполнится только часть, при третьем и последующих вообще не выполняются, пока не перезапустишь сервер - из чего вывод, что проблема на стороне сервера. Так как это c++ я в первую очередь думаю, что причина в неправильной работе с памятью. Возник такой вопрос - допусти есть класс: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Я создаю указатель на объект этого класса, использую его, а потом освобождаю память: Код: plaintext 1. 2. 3. Освободиться ли память выделенная для buffer или необходимо для все элементов класса выполнять эту операцию? Судя по этой информации, необходимость в освобождении памяти для всех элементов есть. Это так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2014, 12:06 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
new buffer[256]; -> new char[256]; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2014, 12:07 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
La France, в деструкторе MyClass ты должен освободить выделенную память, выделенную для данных-членов класса, конечно. Само в С++ ничего не происходит )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2014, 12:41 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
egorych, Ясно. Спасибо! Где же те беззаботные дни, когда я писал на C#?...( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2014, 13:01 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
La France, ошибка с деструктором конечно имеет место. Но ты на всяк случай посмотри статистику коннекшенов в Постгресе. Мне кажется ты их не до конца закрываешь и остаются какие-то ошмётки типа незакрытых сокетов или серверных сессий и они накапливаются от твоих бенчмарков. Это я делаю вывод из факта того что перезагрузка спасает ситуацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2014, 14:25 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
La FranceГде же те беззаботные дни, когда я писал на C#?...(так используй смарт-указатели, а не сырые данные, и будет тебе щастье )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2014, 15:47 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
mayton, Тут дело точно не в памяти, я закомментил сохранение в базу, все остальное осталось - выполняется с любым количеством клиентов. В методе сохранения у меня: коннекшен, таранзакшен, которые после успешного коммита и дисконнекшина я удаляю(освобождаю память), внутри метода сохранения память больше ни под что не выделяется. При тестировании с клиентами все просто замирает и не выдаёт никаких ошибок и не виснет вроде (в консоли все сделано). Протестил не используя клиенты напрямую в бузу те же данные сохранял, все работает при любом количестве новых подключений - вообще не понятно в чем кроется ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2014, 15:57 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
egorych, Наверно первый раз про это услышал - потом гляну, что это такое. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2014, 16:00 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
La FranceПротестил не используя клиенты напрямую в бузу те же данные сохранял Это не опечатка чувак! Это - перл! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2014, 16:04 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
La FranceЗдравствуйте! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Делай так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. И тогда можно забыть про массив на char в классе-при удалении класса осводиться и буфер. Указатель на char берётся так char* pointer=buffer.get() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.03.2014, 17:17 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
smaldДелай так Код: plaintext 1. Не делай так, чтобы не познать все прелести UB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2014, 13:18 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
mayton, Суббота, конец рабочего дня - что ты хочешь?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2014, 06:29 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
Виснет на стороне клиента на методе BIO_do_connect, при создании в цикле очередного клиента - может кто сталкивался с подобной ситуацией? Этот метод определён в библиотеке openSSL предназначенной для шифрования. зы Не совсем в тему, но в продолжение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.03.2014, 13:15 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
MozoksmaldДелай так Код: plaintext 1. Не делай так, чтобы не познать все прелести UB. Какой UB тут? Смущает именно shared? C unique здесь проблем будет больше. Что до инициализации, пока что у меня gcc 4.4.7 ругается на make_shared<char[N]> но первый вариант ведёт себя как и задумано, компилятор понимает всё правильно, без undefine интерпретаций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 11:36 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
smaldКакой UB тут?Ну new и new[] - два разных оператора, так же как delete и delete[]. То что выделено new[] нельзя освобождать delete. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 13:27 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
?smaldКакой UB тут? То что выделено new[] нельзя освобождать delete. Для new[] существует delete[]. А вообще я сторонник и поклонник calloc/free. Но им же развитый C++ подавай с его обёрточными наворотами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 13:45 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
?В дополнение, вдруг в палате не в курсе, при удалении shared_ptr удаляется именно тот массив, указатель на который в него передаётся. И как он был создан, с new[] или с malloc не важно, об массиве с этим указателем заботится ядро, и shared_ptr в деструкторе делает просто free(pointer) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 13:54 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
smald?В дополнение, вдруг в палате не в курсе, при удалении shared_ptr удаляется именно тот массив, указатель на который в него передаётся. И как он был создан, с new[] или с malloc не важно, об массиве с этим указателем заботится ядро, и shared_ptr в деструкторе делает просто free(pointer) Кто вам сказал такую глупость? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 14:06 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
?Кто вам сказал такую глупость? Что именно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 14:13 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
smald, что неважно, как указатель был создан. Если выделение памяти было не c new, то нужно для shared_ptr указывать собственный правильный deleter ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 14:28 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
smaldА вообще я сторонник и поклонник calloc/freeконструкторы/деструкторы руками вызывать любишь? )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 14:31 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
?smald, что неважно, как указатель был создан. Если выделение памяти было не c new, то нужно для shared_ptr указывать собственный правильный deleter То есть если не задать Код: plaintext 1. 2. 3. 4. 5. 6. 7. то память не освобождается? Вы уверены? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 14:42 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
smaldто память не освобождается? Вы уверены? кроме освобождения памяти нужен ещё корректный вызов деструкторов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 14:51 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38603060&tid=2019573]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
90ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 205ms |

| 0 / 0 |
