powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Освобождение выделнной памяти
25 сообщений из 36, страница 1 из 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
25 сообщений из 36, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Освобождение выделнной памяти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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