我开始用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
开始看起。 - Mark Ransom