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

gec*_*cko 10 c++ memory-management

我用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);
Run Code Online (Sandbox Code Playgroud)

所以我为这个项目的下一个版本制定了新战略.到目前为止,我正在做的是创建对象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
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我熟悉编程的基本原则,但作为一个自学成才的爱好者,我不熟悉行业实践和工具.我基本上要求的是内存管理指南:

1)我在做什么是对还是错?

2)我可以使用任何可以帮助我的包或库吗?

3)行业的标准做法是什么?

4)基本上我应该谷歌搜索或购买点燃等?

今天我通常使用Python,它确实为我处理了很多"后端"的东西,但是我需要C或C++(我想我使用普通的C加上stdc ++库,我不太确定它之间的重叠是什么语言是 - 我只知道g ++编译得很好)这个特定的项目出于速度/性能的原因:虽然我怀疑一些数学天才可以提供算法修复,这将加速它没有尽头,尽管这是一个单独的问题.

Kyl*_*e C 6

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

而不是解释已经比我自己更聪明的人详细解释的事情,我将提供一些链接.

你要看的第一个是Herb Sutter的现代C++风格的文章元素 然后看看Bjarne Stroustrup C++ 11 Style的视频

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

  • 如果你不能使用C++ 11(打电话给你的猎头!),有很多东西不能手动管理那些适用于C++ 03的内存. (2认同)