Я пытаюсь понять, как интеллектуальные указатели должны жить с помощью схемы владения объектами ROOT. Мне не нужно было ехать очень далеко. Посмотрите на этоВладение объектами CERN ROOT и C++ 11 Умные указатели
#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. Поскольку я вежливо закрыл файл перед тем, как выйти из моей программы, гистограмма была уничтожена парнем управления памятью ROOT. Теперь в конце main() мой указатель выходит из сферы действия, и его ресурс должен быть освобожден, но он уже освобожден!
Я не нашел ресурсов, связанных с тем, как предполагается, что владение объектами ROOT и управление памятью будут работать с интеллектуальными указателями C++ 11.
Мой вопрос к вам, вы используете интеллектуальные указатели в коде, где включено управление объектами ROOT? Используете ли вы умные указатели C++ 11 в эксперименте HENP?
Если ROOT действительно заботится о собственности, почему вы хотите, чтобы это работало с уникальным_ptr? Я не думаю, что эта определенная часть ROOT предназначена для работы с интеллектуальными указателями (или смарт-что-либо.) – juanchopanza
Ну, я хочу понять, каковы рекомендации различных экспериментаторов/пользователей по использованию интеллектуальных указателей в коде, который обрабатывает объекты ROOT , Если ожидается, что современный C++-код избавится от голых указателей, мы ожидаем увидеть более интеллектуальные указатели в кодах программистов. Так что мы должны просто запретить использование интеллектуальных указателей для обработки объектов ROOT? Отключить управление объектами ROOT? Другие планы от ROOT, чтобы обойти это? – Mustafa
Уверен, но вам нужно использовать только интеллектуальные указатели, когда они вам понадобятся. Если что-то уже принадлежит динамически выделенному объекту, вы не можете пытаться взять на себя ответственность, если у владельца нет своего механизма выпуска. Также обратите внимание, что большая часть этого была, вероятно, «разработана» в дореволюционную эпоху. Один из подходов, который я видел, заключается в том, чтобы скрыть все это управление памятью за более современными интерфейсами, которые, похоже, не полагаются на глобальные объекты и странные соглашения. – juanchopanza