ptr_vector如何管理内存?

2024-04-17

我目前正在使用 c++ 使用 opengl 进行较低级别的编码。我来自一个沉重的 objc 背景,所以我对内存管理有一些了解,但我似乎无法理解“boost”库如何管理容器类型,例如ptr_vector.

我认为我的问题与我不知道如何ptr_vector管理自身及其对象的破坏。

请看一下下面的代码:

// Header file
...
ptr_vector<IObject3D> objects;
...

// Implementation file
...
void ApplicationEngine::init()
{
    WavefrontObject3D *object = new WavefrontObject3D("Ninja.obj");
    objects.push_back(object); 
}
...

所以,对于实际问题:我是否通过“对象”变量在这里造成泄漏?

我习惯于通过 objc 中的显式调用来手动保留和释放对象: 以前我必须alloc initWavefrontObject3Dobject,将其添加到数组中,然后release同一对象以避免泄漏。

但是当我添加一个delete object之后push_back调用 WavefrontObject3D 的解构函数object叫做。这给了我一个暗示ptr_vector不保留object多变的。我的假设正确吗?

附加但相关的问题:假设我想销毁包含类ApplicationEngine我不需要调用某种解构函数吗ptr_vector或者它管理的元素?


不,这不会造成泄漏。全部ptr_*当容器超出范围时,容器将删除存储在其中的对象。

如果将对象添加到容器后删除它,您将创建undefined behavior因为容器将尝试再次删除它。

附加问题:不,如果您存储ptr_vector根据值,它的生命周期由周围类的范围管理。

我们来写一个简单的实现ptr_vector。它不支持间接迭代器和自定义删除器以及许多其他东西,但显示了所使用的原理。

template <typename T>
class ptr_vector {
public:
  // assume control over it
  void push_back(T* x) 
  { if(x) c_.push_back(x); else throw bad_pointer(); }

  ~ptr_vector() { 
    // delete everything that is stored here
    for(auto x : c_)  delete x;
  }
private:
  std::vector<T*> c_;
};


// a user class
struct user_class {
  void addSomething() { x.push_back(new int(23)); }
  ptr_vector<int> x;
};

如果用户类超出范围,则析构函数ptr_vector将要 被调用并且所有内存将被回收。看不到泄漏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ptr_vector如何管理内存? 的相关文章

随机推荐

  • 使用 OCaml 收集外部命令的输出

    在 OCaml 中调用外部命令并收集其输出的正确方法是什么 在Python中 我可以做这样的事情 os popen cmd read 如何在 OCaml 中获取外部程序的所有输出 或者 更好的是 带有 Lwt 的 OCaml Thanks
  • HasThis 和 ExplicitThis 调用约定

    我遇到HasThis and ExplicitThis调用约定 NET框架参考源 https referencesource microsoft com mscorlib system reflection callingconventio
  • 当一个对象被分配给另一个对象时会发生什么

    public class DrumKitTestDrive param args public static void main String args TODO Auto generated method stub Echo e1 new
  • Java 中枚举类型的强制初始化

    我试图找到一种方法来强制 Java 加载 初始化枚举类型 嵌套在包含静态 Map 的类中 这对我来说很重要 因为枚举类型有一个填充所述映射的构造函数 并且如果没有显式方法来初始化此枚举 则映射将保持为空 我尝试过使用Class forNam
  • Tensorflow:如何查看张量板中的检查点?

    假设我有内容检查点 checkpoint model ckpt 240000 data 00000 of 00001 model ckpt 240000 index model ckpt 240000 meta 是否可以在张量板中查看检查点
  • 将 webpack(环境)变量传递给 scss 文件

    对 webpack 非常陌生 我希望能够读取一个值 在本例中具体是env from webpack config js in a sass文件 这样我就可以根据环境有不同的CSS 例如 env 开发 颜色 绿色 env 生产 颜色 蓝色 到
  • 比较没有毫秒的日期时间

    I need to compare dates in two separate list Each list is constructed of MyFile Objects That is a class that I created i
  • Spring Data 和具有分页功能的本机查询

    在一个网络项目中 使用最新的 spring data 1 10 2 和 MySQL 5 6 数据库 我尝试使用带分页的本机查询 但我遇到了org springframework data jpa repository query Inval
  • 如何更改appBar后退按钮颜色

    我不知道如何将应用程序栏的自动后退按钮更改为不同的颜色 它在脚手架下 我试图研究它 但我无法理解它 return Scaffold appBar AppBar backgroundColor Colors white title Image
  • 您上传的二进制文件无效。使用 SDK 的预发布测试版来构建应用程序

    我在将新应用程序提交到应用程序商店时遇到问题 Itunes Connect 给我错误 您上传的二进制文件无效 SDK 的预发布测试版用于构建该应用程序 我没有更改任何内容 我可以编译为临时证书并且工作正常 我昨天上传了另一个应用程序 效果也
  • 如何用CSS取消选择?

    我想从选择中取消选择 id 项目 而不更改 HTML 或添加任何类名 假设我想在 CSS 中模拟这个 Jquery 句子 img not thisone CSS 是否可以 使用 CSS3 not 选择器 它具有等效的jQuery 选择器 h
  • 比较两个 Date 实例是否指同一天

    我有两个 java util Date 的 Java 实例 我必须查明它们是否指同一天 我可以用困难的方法来做到这一点 将日期分开并比较日期 确保年份也匹配 由于这是一个很常见的问题 我希望有一个更简单的解决方案来解决这个问题 Thanks
  • 处理innoDB死锁

    我一直在得到一个Deadlock found when trying to get lock try restarting transaction我的 InnoDB 表上出现错误 这是查询 UPDATE views SET visit cn
  • 如何解决PHP扩展“0”必须加载的问题?

    我正在尝试在我的服务器上安装 Magento 我做了一切 正如文档中所写的 我有以下错误 必须加载 PHP 扩展 0 当我尝试在浏览器中的第二页上配置 Magento 时 会发生这种情况 你知道如何解决这个问题吗 如果您安装的是 Magen
  • PHP 表单从 id 发送值而不是值

    我通常在带有隐藏字段的表单中做类似的事情
  • 如何查找总和位于给定值范围内的整数数组中的所有有序元素对

    给定一个整数数组 查找数组中总和位于给定范围 a b 内的所有有序元素对的数量 这是一个 O n 2 的解决方案 counts all pairs in array such that the sum of pair lies in the
  • 在 JavaScript 中使用 Rails 变量时转义引号?

    我在尝试在 javascript 代码中使用 Rails 变量时遇到问题 例如 我可能定义一个 link to remote 带有参数 complete gt alert my var If my var I m testing 那么 ja
  • 任务似乎自动开始

    我正在移植一个加载时间很长的程序 当我移植它时 它根本没有得到改善 因为缓慢是因为访问数据库服务器 而不是次优代码 我已将加载移动到一个单独的线程上Tasks库 现在 UI 在加载时不会冻结 但它确实让我对某些事情感到好奇 The Task
  • 使用弹簧对安全休息控制器进行单元测试

    我有一个使用 Spring Boot 编写的非常小的 REST 应用程序 我想编写一个用于身份验证的单元测试 但即使我将 MockWithUser 添加到测试中 我也会收到 401 错误 重要的文件是 安全配置 Configuration
  • ptr_vector如何管理内存?

    我目前正在使用 c 使用 opengl 进行较低级别的编码 我来自一个沉重的 objc 背景 所以我对内存管理有一些了解 但我似乎无法理解 boost 库如何管理容器类型 例如ptr vector 我认为我的问题与我不知道如何ptr vec