Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
smald, память высвободится, но не будут вызваны деструкторы элементов массива. Для char не страшно, для объектов захватывающих ресурсы приведет к их утечке. Я уверен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 14:54 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
smaldто память не освобождается? Вы уверены?Это как раз undefined behavior - выделение new[], освобождение delete (не delete[]). В вашем компиляторе оно может работать для char. А в другом компиляторе, где new и new[] по какой-то причине выделяют память из разных куч, привести к порче памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 15:27 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
sherzod_память высвободится, но не будут вызваны деструкторы элементов массива. Для char не страшно, для объектов захватывающих ресурсы приведет к их утечке. Я уверен. Нет, это понятно, но, во первых, речь шла про автоматизацию управления массивом char, выделяемым при создании класса. Во вторых, shared_ptr<My_Class> PTR(new My_Class(args)) при удалении PTR вызывается деструктор My_Class и освобождается выделенная под My_Class память. А в деструкторе мы делаем, что надо. Но, если в MY_Class есть shared/unique_ptr, то и их массивы удаляются при удалении экземпляра My_Class. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 15:27 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
?smaldто память не освобождается? Вы уверены?выделение new[], освобождение delete (не delete[]). В вашем компиляторе оно может работать для char. А в другом компиляторе, где new и new[] по какой-то причине выделяют память из разных куч, привести к порче памяти. Вы смотрели в реализации new/delete? Как они устроены знаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 15:46 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
smaldВы смотрели в реализации new/delete? Как они устроены знаете?То, что в конкретной реализации все работает - это гнилая отмазка. UB - оно такое undefined... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 16:10 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
http://www.cplusplus.com/reference/memory/shared_ptr/~shared_ptr/ ~shared_ptr(); Destroy shared_ptr Destroys the object. But, before, it may produce the following side effects depending on the value of member use_count: If use_count is greater than 1 (i.e., the object is sharing ownership of its managed object with other shared_ptr objects): The use count of the other objects with which it shares ownership is decreased by 1. If use_count is 1 (i.e., the object is the unique owner of the managed pointer): the object pointed by its owned pointer is deleted ( if the shared_ptr object was constructed with a specefic deleter, this is called; Otherwise, the function uses operator delete ). If use_count is zero (i.e., the object is empty), this destructor has no side effects. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 18:38 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
MasterZivDestroy shared_ptr Destroys the object. But, before, it may produce the following side effects depending on the value of member use_count: If use_count is greater than 1 (i.e., the object is sharing ownership of its managed object with other shared_ptr objects): The use count of the other objects with which it shares ownership is decreased by 1. If use_count is 1 (i.e., the object is the unique owner of the managed pointer): the object pointed by its owned pointer is deleted (if the shared_ptr object was constructed with a specefic deleter, this is called; Otherwise, the function uses operator delete). If use_count is zero (i.e., the object is empty), this destructor has no side effects. Если нигде не делали ptr2=ptr1, то при уничтожении ptr1 объект in deth, в противном случае in deth при умирании ptr2. Но для параноиков есть unique_ptr. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 18:58 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
smaldMasterZivDestroy shared_ptr Destroys the object. But, before, it may produce the following side effects depending on the value of member use_count: If use_count is greater than 1 (i.e., the object is sharing ownership of its managed object with other shared_ptr objects): The use count of the other objects with which it shares ownership is decreased by 1. If use_count is 1 (i.e., the object is the unique owner of the managed pointer): the object pointed by its owned pointer is deleted (if the shared_ptr object was constructed with a specefic deleter, this is called; Otherwise, the function uses operator delete). If use_count is zero (i.e., the object is empty), this destructor has no side effects. Если нигде не делали ptr2=ptr1, то при уничтожении ptr1 объект in deth, в противном случае in deth при умирании ptr2. Но для параноиков есть unique_ptr. Что такое in deth? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 18:59 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
Death, не death... Я имел в виду, что то, какой будет вызываться делитор, зависит от того, как указатель был сконструирован. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 19:03 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
MasterZivDeath, не death.. Не Death а именно deth Я имел в виду, что то, какой будет вызываться делитор, зависит от того, как указатель был сконструирован. Вы заглядывали в исходники реализаций? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 19:34 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
smald?пропущено... выделение new[], освобождение delete (не delete[]). В вашем компиляторе оно может работать для char. А в другом компиляторе, где new и new[] по какой-то причине выделяют память из разных куч, привести к порче памяти. Вы смотрели в реализации new/delete? Как они устроены знаете? Ну так загляните в хеадер <new>, делов-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.04.2014, 23:32 |
|
||
|
Освобождение выделнной памяти
|
|||
|---|---|---|---|
|
#18+
BagaBagasmaldпропущено... Вы смотрели в реализации new/delete? Как они устроены знаете? Ну так загляните в хеадер <new>, делов-то.Ну в заголовок заглянуть недостаточно. Надо смотреть код, который компилятор генерирует. Конструкторы-то вызывает не operator new. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.04.2014, 05:39 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2019573]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 322ms |
| total: | 456ms |

| 0 / 0 |
