Я начал проект на C++. Управление памятью на этом языке для меня ново.
Раньше я создавал объекты с помощью new ()
, а затем передавал указатели, и пока это работало, отладка была болезненной, и люди смотрели на меня смешно, когда видели код. Я очень горжусь тем фактом, что это не было утечкой или segfault (когда-то исправлено), но это действительно стоило больших усилий.
list <struct Connection *> users;
struct Connection * accept_connection (const char *name) {
struct Connection * new_node = new Connection ();
new_node->_data = ... // whatever, set it up here
return new_node;
}
struct Connection * new_user = accept_connection (const char *name);
users.append (new_user);
Итак, у меня есть новая стратегия для следующей версии проекта. До сих пор я создавал объекты с new()
и присваивал им уникальный целочисленный идентификационный номер. Затем я сохраняю объект в хэш-таблице, используя идентификатор в качестве ключа. Теперь элементы хранятся и передаются по целочисленному идентификационному номеру, и когда вам нужно отменить ссылку на него, вы переходите к хэш-таблице, и она возвращает вам либо вещь *
, либо NULL
. . Следовательно, я больше не сталкиваюсь с ошибками указателя, но скорость кода несколько снижается.
typedef unsigned long ID_Number;
// create a user and return the ID
ID_Number create_user () {
ID_Number new_id = assign_unique_id ();
struct User * node = new User ();
node->_id = new_id;
node->_data = ... // whatever, set it up here
add_to_users_dict (new_id, node);
return new_id;
}
list <ID_Number> users;
for_each (users.begin(), users.end(), process_user);
void process_user (ID_Number i) {
struct User * u_ptr = lookup_user_dict (i);
if (u_ptr == NULL) {
// not found in dict
// somehow this guy was deleted
} else {
// we can do stuff with this guy
}
}
Сейчас я немного знаком с основными принципами программирования, но, будучи самоучкой-любителем, я не знаком с отраслевыми практиками и инструментами.В основном я прошу рекомендации по управлению памятью:
1) Что я делаю правильно или неправильно?
2) Есть ли какие-нибудь пакеты или библиотеки, которые могли бы мне помочь?
3) Каковы стандартные практики отрасли?
4) В основном, что я должен гуглить или покупать для Kindle и т. д.?
Сегодня я обычно использую Python, он справляется со многими «внутренними» задачами, но мне нужен C или C++ (думаю, я использую простой C плюс библиотеки stdc++, я не совсем уверен, где перекрытие между языками - я просто знаю, что g++ компилирует его нормально) для этого конкретного проекта по причинам скорости/производительности: хотя я подозреваю, что какой-то гений математики мог бы предоставить алгоритмические исправления, которые ускорили бы его бесконечно, хотя это отдельный вопрос.