powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си. Освободить память 2-мерного сторкового массива
25 сообщений из 308, страница 8 из 13
Си. Освободить память 2-мерного сторкового массива
    #40130898
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не буду ничего советовать. Просто кажется что ты окончательно выбрал "C" как инструмент
написания этого Proof-Of-Concept, хотя по идее надо было его сналача обкатать даже на shell-скриптах или Python
и посмотреть где там что первое умрёт. Обежден что проблемы сетью и ошибки тебя похоронят. Просто закопаешся
в нюансах.

По мультипоточке - создай отдельный топик обязательно. Это будет длинная тема...
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130899
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Не буду ничего советовать. Просто кажется что ты окончательно выбрал "C" как инструмент
написания этого Proof-Of-Concept, хотя по идее надо было его сналача обкатать даже на shell-скриптах или Python
и посмотреть где там что первое умрёт. Обежден что проблемы сетью и ошибки тебя похоронят. Просто закопаешся
в нюансах.

По мультипоточке - создай отдельный топик обязательно. Это будет длинная тема...


На баше отработано. Немного другая архитектура и нагрузка на сеть меньша раз в 20 примерно, но суть такая же.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130900
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ура, удалось получить Segmentation fault

когда закомментировал выделение памяти в массиве, что ожидаемо:

Код: plaintext
1.
struct pair *arr; // = malloc(sizeof(struct pair) * N);





Но настораживает отсутствие Segmentation fault даже когда N=0, даже когда прямо 0 прописываю:


Код: plaintext
1.
struct pair *arr = malloc(sizeof(struct pair) * 0);



все равно нет ошибок.

Не пойму почему так...
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130901
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После каждого творческого эксперимента запускай свой бинарь под valgrind.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130902
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ

На баше отработано. Немного другая архитектура и нагрузка на сеть меньша раз в 20 примерно, но суть такая же.

Даже не буду спрашивать как вы там ошибки отрабатываете и retry-logic.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130905
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Уткъ

На баше отработано. Немного другая архитектура и нагрузка на сеть меньша раз в 20 примерно, но суть такая же.

Даже не буду спрашивать как вы там ошибки отрабатываете и retry-logic.


чуть что kill -9 и все бояться и работает хорошо )
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130907
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы почти создали Erlang/OTP. Ну дай бог.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130925
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Ура, удалось получить Segmentation fault

когда закомментировал выделение памяти в массиве, что ожидаемо:

Код: plaintext
1.
struct pair *arr; // = malloc(sizeof(struct pair) * N);

Здесь неизвестно куда показывает указатель. Может показывать на доступную память, может показывать на недоступную. И раз у тебя упало - значит показывал туда, куда тебе лазить нельзя (в смысле в адресное пространство других процессов).


Уткъ

Но настораживает отсутствие Segmentation fault даже когда N=0, даже когда прямо 0 прописываю:


Код: plaintext
1.
struct pair *arr = malloc(sizeof(struct pair) * 0);



все равно нет ошибок.

Не пойму почему так...
А здесь ты задал указателю адрес в твоей родной куче и туда лазить можно.
Но ты что ты выделил ноль байт - означает что если ты начнешь в эту память писать - ты залезешь в пространство другого указателя который выдал тебе другой malloc();
Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int *a = malloc(sizeof(int) * 3);
int *b = malloc(sizeof(int) * 0);
int *c = malloc(sizeof(int) * 3);
printf("a=%p b=%p c=%p\n", a, b, c);

for (int i=0; i<3; i++) {
   a[i] = 0;
   c[i] = 0;
}

b[1] = 123;

for(int i=0; i<3; i++) printf("a[%d] = %d\n", i, a[i]);
for(int i=0; i<3; i++) printf("c[%d] = %d\n", i, c[i]);

Чаще всего, ты обращаясь к b залезешь в память c, но может быть и в a - это зависит от менеджера памяти (который предоставляется твоим компилятором).
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130931
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Читаю про массивы структур. Это круто.

Но меня смущает что там ни где не выделяют и не высвобождают память:

https://metanit.com/cpp/c/6.4.php


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <stdio.h>
 
struct person 
{
    int age;
    char name[20];
};
 
int main(void)
{
    struct person people[] = {23, "Tom", 32, "Bob", 26, "Alice", 41, "Sam"};
    int n = sizeof(people)/sizeof(people[0]);
    for(int i=0; i<n; i++)
    {
        printf("Name:%s \t Age: %d \n", people[i].name, people[i].age);
    }
    return 0;
}


Ну и меня насторажило что не выпало ни разу сегментайшн фаулт, с массивом структур.


Если кратко: память для переменных может выделятся на стеке и в куче . Когда явно выделяешь (malloc()), то выделяется в куче, неявно - на стеке. В основном на стеке располагаются локальные переменные, но ничто не мешает массив там расположить как в данном примере. Только имей ввиду что стек маленький, всего 1Мб обычно. Если будешь большие массивы там хранить, то словишь переполнение стэка (stack overflow)
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130943
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl
Уткъ
Ура, удалось получить Segmentation fault

когда закомментировал выделение памяти в массиве, что ожидаемо:

Код: plaintext
1.
struct pair *arr; // = malloc(sizeof(struct pair) * N);

Здесь неизвестно куда показывает указатель. Может показывать на доступную память, может показывать на недоступную. И раз у тебя упало - значит показывал туда, куда тебе лазить нельзя (в смысле в адресное пространство других процессов).


Уткъ

Но настораживает отсутствие Segmentation fault даже когда N=0, даже когда прямо 0 прописываю:


Код: plaintext
1.
struct pair *arr = malloc(sizeof(struct pair) * 0);



все равно нет ошибок.

Не пойму почему так...
А здесь ты задал указателю адрес в твоей родной куче и туда лазить можно.
Но ты что ты выделил ноль байт - означает что если ты начнешь в эту память писать - ты залезешь в пространство другого указателя который выдал тебе другой malloc();
Например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int *a = malloc(sizeof(int) * 3);
int *b = malloc(sizeof(int) * 0);
int *c = malloc(sizeof(int) * 3);
printf("a=%p b=%p c=%p\n", a, b, c);

for (int i=0; i<3; i++) {
   a[i] = 0;
   c[i] = 0;
}

b[1] = 123;

for(int i=0; i<3; i++) printf("a[%d] = %d\n", i, a[i]);
for(int i=0; i<3; i++) printf("c[%d] = %d\n", i, c[i]);

Чаще всего, ты обращаясь к b залезешь в память c, но может быть и в a - это зависит от менеджера памяти (который предоставляется твоим компилятором).


Теперь понятно, благодарю :-)
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130944
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
Читаю про массивы структур. Это круто.

Но меня смущает что там ни где не выделяют и не высвобождают память:

https://metanit.com/cpp/c/6.4.php


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <stdio.h>
 
struct person 
{
    int age;
    char name[20];
};
 
int main(void)
{
    struct person people[] = {23, "Tom", 32, "Bob", 26, "Alice", 41, "Sam"};
    int n = sizeof(people)/sizeof(people[0]);
    for(int i=0; i<n; i++)
    {
        printf("Name:%s \t Age: %d \n", people[i].name, people[i].age);
    }
    return 0;
}


Ну и меня насторажило что не выпало ни разу сегментайшн фаулт, с массивом структур.


Если кратко: память для переменных может выделятся на стеке и в куче . Когда явно выделяешь (malloc()), то выделяется в куче, неявно - на стеке. В основном на стеке располагаются локальные переменные, но ничто не мешает массив там расположить как в данном примере. Только имей ввиду что стек маленький, всего 1Мб обычно. Если будешь большие массивы там хранить, то словишь переполнение стэка (stack overflow)


Как все не просто оказалось, хорошо что 0 попробовал поставить.

Спасибо :-)
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130945
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, в чистом Си есть исключения?

типа

Код: plaintext
1.
2.
3.
4.
5.
6.
begin

пробуем что-то сделать

exception
end;
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130946
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Кстати, в чистом Си есть исключения?

типа

Код: plaintext
1.
2.
3.
4.
5.
6.
begin

пробуем что-то сделать

exception
end;


Нет. В С++ есть
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130953
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T
Уткъ
Кстати, в чистом Си есть исключения?

типа

Код: plaintext
1.
2.
3.
4.
5.
6.
begin

пробуем что-то сделать

exception
end;


Нет. В С++ есть


Жалко.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130960
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Терпи Сам выбрал.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130966
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Терпи Сам выбрал.



Ага....


Получается после каждой опасной команды надо статус выполнения проверять и обрабатывать если что-то нет так идет...
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130970
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совершенно верно. Почти все функции kernel возвращают результат. В виде целого числа. Или в виде NULL/not NULL
указателя. И твоя обязанность как С-разработчика всегда проверять этот результат. Открыл файл через fopen - тут-же
проверил. Отпавил пачку данных в сокет через send - тут-же проверил на (-1) и так далее. С функциями libpq - тоже
самое. Проверяй вообще все что можно проверять.

Игнорировать это правило можно только в тех языках где механика exceptions позволяет сделать обобщённые обработчики
ошибок для целых блоков кода или целых стеков.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130980
bk0010
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Dima T
пропущено...

Нет. В С++ есть


Жалко.
Ничуть. Исключения рулят, когда они поддержаны на уровне основных библиотек. А в C++ ошибки обычно ловят по возврату функции. Я, по делфийской привычке, поначалу в try catch код обертывал, а потом большими глазами смотрел в отладке, как у меня успешно считываются неадекватные значения из несуществующих полей БД и т.д.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40130996
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда никто не выкидывает исключений - некому их и ловить.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40131008
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда блок catch ничего не делает - складывается ощущение что ... Все... Чики-пики
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40131017
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уткъ
Пока нарисовал строки.
"A" - это 1 символ.
Уже неправильно - C API это ASCIIZ-строки, завершаемые нулевым байтом.
Если объявлять строку символов в тексте ("Ц"), то "компилятор умный" и нулевой байт добавит.
Если работать с char-массивами, то "плюсадын и (временами) \0". Как-то так.
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40131509
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

в 1000 потоков не хочет:

connection to server failed: could not create socket: Too many open files

похоже коннекты как-то файлы занимают в ОС...




А подскажите что еще занимать файлы?
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40131528
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эта поведение не связано с С++. Особенности ОС linux.

Глянь как тут пишут https://stackoverflow.com/questions/880557/socket-accept-too-many-open-files
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40131532
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И даже не "особенности", а конфигурация защиты от дураков.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Си. Освободить память 2-мерного сторкового массива
    #40131642
Уткъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton
Эта поведение не связано с С++. Особенности ОС linux.

Глянь как тут пишут https://stackoverflow.com/questions/880557/socket-accept-too-many-open-files


Да, я понимаю это с С напрямую не связано.

Настройки в ОС поменял конечно-же сразу.

Но интересует, на что эти самые файлы расходуются?

Я подозреваю что на коннекты к БД .

А на что-нибудь еще может расходоваться?
...
Рейтинг: 0 / 0
25 сообщений из 308, страница 8 из 13
Форумы / C++ [игнор отключен] [закрыт для гостей] / Си. Освободить память 2-мерного сторкового массива
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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