首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++内存管理技术/实践

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

Stack Overflow用户
提问于 2012-05-23 00:03:27
回答 4查看 9.6K关注 0票数 12

我已经在C++中启动了一个项目。这种语言的内存管理对我来说还是个新鲜事。

我过去常常用new ()创建对象,然后传递指针,虽然它可以工作,但调试起来很痛苦,当人们看到代码时,他们会奇怪地看着我。我很自豪的是它没有泄漏或段错误(一旦修复),但它真的很费力。

代码语言:javascript
复制
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。因此,我不再遇到指针错误,但代码的速度有所降低。

代码语言:javascript
复制
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++将其编译得很好):尽管我怀疑一些数学天才可以提供算法修复来加速它,尽管这是一个单独的问题。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-23 00:16:09

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

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

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

如果您能够使用新的C++11标准,那么它将使内存管理变得比以前更干净。

票数 9
EN

Stack Overflow用户

发布于 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。

票数 2
EN

Stack Overflow用户

发布于 2012-05-23 00:17:28

1)我做的是对的还是错的?

您没有使用资源获取是初始化(RAII)习惯用法或现代C++所有权语义。

2)有没有我可以使用的包或库可以帮助我?

如果你确实需要传递指针,你可以使用std::unique_ptr和std::shared_ptr。但在此之前,您应该了解如何使用RAII语义使您自己的对象表现为资源所有者。

3)行业的标准实践是什么?

4)基本上,我应该在谷歌上搜索或购买kindle等内容?

RAII

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10705754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档