Методы/практики управления памятью C++

Я начал проект на 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++ компилирует его нормально) для этого конкретного проекта по причинам скорости/производительности: хотя я подозреваю, что какой-то гений математики мог бы предоставить алгоритмические исправления, которые ускорили бы его бесконечно, хотя это отдельный вопрос.

10
задан gecko 22 May 2012 в 16:03
поделиться