powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Освобождение выделнной памяти
36 сообщений из 36, показаны все 2 страниц
Освобождение выделнной памяти
    #38599767
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Тестирую сервер запуская в двух потоках создание клиентов в цикле - пока по 150 клиентов в каждом. Клиенты подключаются и посылают данные серверу. Сервер принимает данные, обрабатывает и сохраняет их в базу (postgresql), создавая подключения к базе для каждого клиента и разрывая его по выполнению запроса. Работает такая схема у меня по разному: 1) Запустил сервер, запустил циклы с клиентами - все 300 выполняются; 2) Запустил сервер, запустил циклы - первый раз выполнятся все 300, при втором запуске выполнится только часть, при третьем и последующих вообще не выполняются, пока не перезапустишь сервер - из чего вывод, что проблема на стороне сервера. Так как это c++ я в первую очередь думаю, что причина в неправильной работе с памятью. Возник такой вопрос - допусти есть класс:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    class MyClass
    {
    private:
        char* buffer;
    public:
        MyClass()
        {
            buffer = new buffer[256];
        }
    };


Я создаю указатель на объект этого класса, использую его, а потом освобождаю память:
Код: plaintext
1.
2.
3.
MyClass* mc = new MyClass();
//использую
delete mc;


Освободиться ли память выделенная для buffer или необходимо для все элементов класса выполнять эту операцию?

Судя по этой информации, необходимость в освобождении памяти для всех элементов есть. Это так?
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38599768
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
new buffer[256]; -> new char[256];
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38599780
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
La France, в деструкторе MyClass ты должен освободить выделенную память, выделенную для данных-членов класса, конечно. Само в С++ ничего не происходит ))
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38599792
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorych,

Ясно. Спасибо!

Где же те беззаботные дни, когда я писал на C#?...(
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38599830
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
La France, ошибка с деструктором конечно имеет место. Но ты на всяк случай посмотри статистику
коннекшенов в Постгресе. Мне кажется ты их не до конца закрываешь и остаются какие-то ошмётки
типа незакрытых сокетов или серверных сессий и они накапливаются от твоих бенчмарков.

Это я делаю вывод из факта того что перезагрузка спасает ситуацию.
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38599854
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
La FranceГде же те беззаботные дни, когда я писал на C#?...(так используй смарт-указатели, а не сырые данные, и будет тебе щастье ))
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38599858
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

Тут дело точно не в памяти, я закомментил сохранение в базу, все остальное осталось - выполняется с любым количеством клиентов. В методе сохранения у меня: коннекшен, таранзакшен, которые после успешного коммита и дисконнекшина я удаляю(освобождаю память), внутри метода сохранения память больше ни под что не выделяется. При тестировании с клиентами все просто замирает и не выдаёт никаких ошибок и не виснет вроде (в консоли все сделано). Протестил не используя клиенты напрямую в бузу те же данные сохранял, все работает при любом количестве новых подключений - вообще не понятно в чем кроется ошибка.
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38599859
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorych,

Наверно первый раз про это услышал - потом гляну, что это такое. Спасибо!
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38599862
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
La FranceПротестил не используя клиенты напрямую в бузу те же данные сохранял
Это не опечатка чувак! Это - перл!
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38599877
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
La FranceЗдравствуйте!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    class MyClass
    {
    private:
        char* buffer;
    public:
        MyClass()
        {
            buffer = new buffer[256];
        }
    };




Делай так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 
 class MyClass
    {
    private:
        shared_ptr<char> buffer;
    public:
        MyClass()
        {
            buffer =shared_ptr<char>( new char[256]);
        }
    };



И тогда можно забыть про массив на char в классе-при удалении класса осводиться и буфер.
Указатель на char берётся так char* pointer=buffer.get()
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38600130
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smaldДелай так

Код: plaintext
1.
            buffer =shared_ptr<char>( new char[256]);



Не делай так, чтобы не познать все прелести UB.
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38600444
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

Суббота, конец рабочего дня - что ты хочешь?)
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38600744
La France
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Виснет на стороне клиента на методе BIO_do_connect, при создании в цикле очередного клиента - может кто сталкивался с подобной ситуацией? Этот метод определён в библиотеке openSSL предназначенной для шифрования.

зы Не совсем в тему, но в продолжение.
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38602787
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MozoksmaldДелай так

Код: plaintext
1.
            buffer =shared_ptr<char>( new char[256]);



Не делай так, чтобы не познать все прелести UB.
Какой UB тут? Смущает именно shared? C unique здесь проблем будет больше.
Что до инициализации, пока что у меня gcc 4.4.7 ругается на make_shared<char[N]>
но первый вариант ведёт себя как и задумано, компилятор понимает всё правильно, без undefine интерпретаций.
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38602973
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
smaldКакой UB тут?Ну new и new[] - два разных оператора, так же как delete и delete[].
То что выделено new[] нельзя освобождать delete.
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38602978
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38602994
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?smaldКакой UB тут?
То что выделено new[] нельзя освобождать delete.

Для new[] существует delete[].

А вообще я сторонник и поклонник calloc/free. Но им же развитый C++
подавай с его обёрточными наворотами.
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603007
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?В дополнение, вдруг в палате не в курсе,
при удалении shared_ptr удаляется именно тот массив,
указатель на который в него передаётся. И как он был создан,
с new[] или с malloc не важно, об массиве с этим указателем заботится ядро,
и shared_ptr в деструкторе делает просто free(pointer)
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603023
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
smald?В дополнение, вдруг в палате не в курсе,
при удалении shared_ptr удаляется именно тот массив,
указатель на который в него передаётся. И как он был создан,
с new[] или с malloc не важно, об массиве с этим указателем заботится ядро,
и shared_ptr в деструкторе делает просто free(pointer) Кто вам сказал такую глупость?
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603036
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?Кто вам сказал такую глупость?

Что именно?
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603060
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
smald, что неважно, как указатель был создан.
Если выделение памяти было не c new, то нужно для shared_ptr указывать собственный правильный deleter
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603066
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smaldА вообще я сторонник и поклонник calloc/freeконструкторы/деструкторы руками вызывать любишь? ))
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603091
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?smald, что неважно, как указатель был создан.
Если выделение памяти было не c new, то нужно для shared_ptr указывать собственный правильный deleter

То есть если не задать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
struct del {    // a verbose array deleter:
  void operator()(int* p) {
    delete[] p;
  }
};

shared_ptr<char>(new char[1000000], del());


то память не освобождается?

Вы уверены?
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603100
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smaldто память не освобождается?

Вы уверены?
кроме освобождения памяти нужен ещё корректный вызов деструкторов
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603105
sherzod_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smald,

память высвободится, но не будут вызваны деструкторы элементов массива. Для char не страшно, для объектов захватывающих ресурсы приведет к их утечке. Я уверен.
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603150
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
smaldто память не освобождается?

Вы уверены?Это как раз undefined behavior - выделение new[], освобождение delete (не delete[]). В вашем компиляторе оно может работать для char. А в другом компиляторе, где new и new[] по какой-то причине выделяют память из разных куч, привести к порче памяти.
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603151
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sherzod_память высвободится, но не будут вызваны деструкторы элементов массива. Для char не страшно, для объектов захватывающих ресурсы приведет к их утечке. Я уверен.

Нет, это понятно, но, во первых, речь шла про
автоматизацию управления массивом char, выделяемым при создании класса.
Во вторых, shared_ptr<My_Class> PTR(new My_Class(args)) при удалении PTR
вызывается деструктор My_Class и освобождается выделенная под My_Class память.
А в деструкторе мы делаем, что надо. Но, если в MY_Class есть shared/unique_ptr, то
и их массивы удаляются при удалении экземпляра My_Class.
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603188
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?smaldто память не освобождается?

Вы уверены?выделение new[], освобождение delete (не delete[]). В вашем компиляторе оно может работать для char. А в другом компиляторе, где new и new[] по какой-то причине выделяют память из разных куч, привести к порче памяти.

Вы смотрели в реализации new/delete? Как они устроены знаете?
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603230
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
smaldВы смотрели в реализации new/delete? Как они устроены знаете?То, что в конкретной реализации все работает - это гнилая отмазка. UB - оно такое undefined...
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603432
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603446
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603449
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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?
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603453
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Death, не death...
Я имел в виду, что то, какой будет вызываться делитор, зависит от того, как указатель был сконструирован.
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603481
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivDeath, не death..
Не Death а именно deth
Я имел в виду, что то, какой будет вызываться делитор, зависит от того, как указатель был сконструирован.

Вы заглядывали в исходники реализаций?
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603617
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smald?пропущено...
выделение new[], освобождение delete (не delete[]). В вашем компиляторе оно может работать для char. А в другом компиляторе, где new и new[] по какой-то причине выделяют память из разных куч, привести к порче памяти.

Вы смотрели в реализации new/delete? Как они устроены знаете?

Ну так загляните в хеадер <new>, делов-то.
...
Рейтинг: 0 / 0
Освобождение выделнной памяти
    #38603669
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
BagaBagasmaldпропущено...


Вы смотрели в реализации new/delete? Как они устроены знаете?

Ну так загляните в хеадер <new>, делов-то.Ну в заголовок заглянуть недостаточно. Надо смотреть код, который компилятор генерирует. Конструкторы-то вызывает не operator new.
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Освобождение выделнной памяти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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