我已经在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++将其编译得很好):尽管我怀疑一些数学天才可以提供算法修复来加速它,尽管这是一个单独的问题。
发布于 2012-05-23 00:16:09
我能给出的最好的答案是,你不应该以传统的方式使用指针。C++11改变了程序员处理内存管理的方式。
我不会解释那些已经被比我聪明得多的人详细解释过的东西,我只会提供一些链接。
首先你应该看看Herb Sutter的文章Elements of Modern C++ Style,然后看看Bjarne Stroustrup C++11 Style的视频
如果您能够使用新的C++11标准,那么它将使内存管理变得比以前更干净。
发布于 2012-05-23 00:17:53
我做的是对的还是错的?
实际上,您已经创建了一个使用句柄而不是直接指针来引用对象的系统。这可能适用于某些场景。当操作系统“拥有”对象并管理其生命周期,但允许客户端引用它时,操作系统通常使用句柄。
有没有我可以使用的包或库可以帮助我?
现代C++中的标准库有shared_ptr和unique_ptr,它们是管理动态对象生命周期的智能指针。它们是使用RAII的一种很好的方式。
该行业的标准做法是什么?
C++中的事实标准是RAII --资源分配是初始化。RAII将分配绑定到构造函数,将释放绑定到析构函数。由于C++对如何以及何时执行C‘to和D’to有可靠的保证,这为您提供了一种完美的方法来管理对象生命周期,而不会发生泄漏。智能指针shared_ptr和unique_ptr也使对象的所有权显式。
基本上,我应该在谷歌上搜索或为kindle等购买什么?
搜索RAII。
发布于 2012-05-23 00:17:28
1)我做的是对的还是错的?
您没有使用资源获取是初始化(RAII)习惯用法或现代C++所有权语义。
2)有没有我可以使用的包或库可以帮助我?
如果你确实需要传递指针,你可以使用std::unique_ptr和std::shared_ptr。但在此之前,您应该了解如何使用RAII语义使您自己的对象表现为资源所有者。
3)行业的标准实践是什么?
4)基本上,我应该在谷歌上搜索或购买kindle等内容?
RAII
https://stackoverflow.com/questions/10705754
复制相似问题