C++ でプロジェクトを開始しました。この言語でのメモリ管理は、私にとって初めてのことです。
以前はオブジェクトを作成しnew ()
てポインターを渡していましたが、それが機能している間はデバッグが面倒で、コードを見たときに変な目で見られました。リークやセグメンテーション フォールト (修正後) が発生しなかったことは非常に誇りに思っていますが、これには本当に多くの労力が必要でした。
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 ()
して一意の整数 ID 番号を割り当てています。次に、ID をキーとして使用して、オブジェクトをハッシュ テーブルに格納します。アイテムは格納され、整数の ID 番号で渡されます。逆参照する必要がある場合は、ハッシュ テーブルに移動すると、thing *
またはが返されます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 ++が正常にコンパイルされることを知っているだけです)速度/パフォーマンス上の理由から、この特定のプロジェクトの場合:数学の天才の中には、それを際限なく高速化するアルゴリズム修正を提供できると思いますが、それは別の質問です.