gpt4 book ai didi

C++ 内存管理技术/实践

转载 作者:可可西里 更新时间:2023-11-01 16:37:44 28 4
gpt4 key购买 nike

我用 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++ 可以很好地编译它)对于这个特定项目出于速度/性能原因:尽管我怀疑一些数学天才可以提供算法修复来加速它,尽管这是一个单独的问题。

最佳答案

我能给出的最佳答案是,您不应该以传统方式使用指针。 C++11 改变了程序员处理内存管理的方式。

我不会解释那些比我聪明得多的人已经详细解释过的事情,我只会提供一些链接。

您应该首先查看 Herb Sutter 的文章 Elements of Modern C++ Style然后查看 Bjarne Stroustrup 的视频 C++11 Style

如果您能够使用新的 C++11 标准,那么它会使内存管理比以前更清晰。

关于C++ 内存管理技术/实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10705754/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com