【发布时间】:2012-05-29 03:55:53
【问题描述】:
我已经用 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++ 可以很好地编译它)对于这个特定项目的速度/性能原因:虽然我怀疑一些数学天才可以提供算法修复来加速它,尽管这是一个单独的问题。
【问题讨论】:
-
首先查看
shared_ptr。 -
我使用的第一个工具是 valgrind:valgrind.org/docs/manual/QuickStart.html
-
查找 RAII。这有点疯狂。
-
听起来你会从a good C++ book 中受益良多。
标签: c++ memory-management