首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CERN根目录的对象所有权和C++11智能指针

CERN根目录的对象所有权和C++11智能指针
EN

Stack Overflow用户
提问于 2014-12-17 03:01:42
回答 3查看 1.7K关注 0票数 3

我正在尝试理解智能指针是如何与根对象所有权方案共存的。我不需要走太远。看看这个

代码语言:javascript
复制
#include <iostream>
#include <memory>
#include "TH1F.h"
#include "TFile.h"

int main()
{
  TFile f("out.root", "recreate");
  f.cd();
  std::unique_ptr<TH1F> h {new TH1F("h", "h", 100, -5, 5)};
  h->FillRandom("gaus", 10000);
  h->Write();
  f.Close();

  return 0;
}

由唯一指针处理的直方图归当前gDirectory所有。因为我在退出程序之前礼貌地关闭了文件,所以直方图被根内存管理人员破坏了。现在在main()的末尾,我的指针超出了作用域,它的资源需要被释放,但它已经被释放了!

我还没有找到任何关于根对象所有权/内存管理如何与C++11智能指针共存的资源。

我的问题是,您是否在开启根对象管理的代码中使用智能指针?你在HENP实验中使用C++11智能指针了吗?

EN

回答 3

Stack Overflow用户

发布于 2014-12-17 23:23:20

如果您使用TH1::AddDirectory(false),您将管理直方图,然后使用智能指针将不会有任何问题。

票数 2
EN

Stack Overflow用户

发布于 2016-02-15 07:52:56

如果您使用的是std::unique_ptr,那么您确实希望它是该对象的唯一所有者。您可以使用h->SetDirectory关闭一个直方图的根对象所有权

代码语言:javascript
复制
#include <iostream>
#include <memory>
#include "TH1F.h"
#include "TFile.h"

int main()
{
  TFile f("out.root", "recreate");
  f.cd();
  std::unique_ptr<TH1F> h {new TH1F("h", "h", 100, -5, 5)};
  h->SetDirectory(0);
  h->FillRandom("gaus", 10000);
  h->Write();
  f.Close();

  return 0;
}

这样,对于所有其他直方图,您仍然拥有ROOT的对象所有权,但是您可以自己拥有这个直方图。

票数 2
EN

Stack Overflow用户

发布于 2014-12-17 05:40:13

好吧,我猜要让unique_ptr和ROOT幸福地结婚,你必须使用定制deleter。

在自定义删除程序中,您必须检查直方图是否仍然有效并将其删除,否则将其设置为no-op

类似于(伪代码)

代码语言:javascript
复制
auto deleter = [](TH1F* p) { key = FindKey(p->Name); if (key) delete p };

std::unique_ptr<TH1F, decltype(deleter)> h{new TH1F("h", "h", 100, -5, 5), deleter};

可以设计出更复杂的方案。

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

https://stackoverflow.com/questions/27511995

复制
相关文章

相似问题

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