我正在尝试理解智能指针是如何与根对象所有权方案共存的。我不需要走太远。看看这个
#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智能指针了吗?
发布于 2014-12-17 23:23:20
如果您使用TH1::AddDirectory(false),您将管理直方图,然后使用智能指针将不会有任何问题。
发布于 2016-02-15 07:52:56
如果您使用的是std::unique_ptr,那么您确实希望它是该对象的唯一所有者。您可以使用h->SetDirectory关闭一个直方图的根对象所有权
#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的对象所有权,但是您可以自己拥有这个直方图。
发布于 2014-12-17 05:40:13
好吧,我猜要让unique_ptr和ROOT幸福地结婚,你必须使用定制deleter。
在自定义删除程序中,您必须检查直方图是否仍然有效并将其删除,否则将其设置为no-op
类似于(伪代码)
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};可以设计出更复杂的方案。
https://stackoverflow.com/questions/27511995
复制相似问题