Согласно следующей статье: Why isn’t the destructor called at the end of scope?Удалять объект внутри функции: некрасиво, подверженных ошибкам, неэффективна, и, как правило, не исключение безопасного
код, который создает объект с использованием новых, а затем удаляет его в конце тот же самый охват является уродливым, подверженным ошибкам, неэффективным и обычно небезопасным. Например:
void very_bad_func() // ugly, error-prone, and inefficient
{
X* p = new X;
// use p
delete p; // not exception-safe
}
Мой код, который я надеюсь, что не безобразно:
Я создаю объект типа TiXmlDocument
и удалить его до конца функции.
void DataLoader::readXmlFile(const string & file)
{
TiXmlDocument *doc = new TiXmlDocument(file.c_str());
bool loadOkay = doc->LoadFile();
TiXmlHandle hdl(doc);
//work is done in here
if(loadOkay)
{
TiXmlElement * pRoot = hdl.FirstChildElement().Element();//.FirstChildElement().Element();
parseFile(pRoot);
}
else
{
cout <<"Error: "<< doc->ErrorDesc()<<endl;
}
//deallocate doc
delete doc;
}
Вопрос (ы):
- Должен ли я использовать
DataLoader::~DataLoader() {}
деструктор для того, чтобы гарантировать, что объект будет удален после того, как я покину сферу функции? без необходимости явно удалять егоdelete doc
.
Как предположил я сделал следующее:
TiXmlDocument doc(xmlFile.c_str());
bool loadOkay = doc.LoadFile();
TiXmlHandle hdl(&doc);
Я начинаю думать, что использование динамической памяти так же, как Java и C# не является хорошей практикой (следует использовать в ответственной способ) в C++. Если нет реальной причины использовать его, тогда нет. Если не обрабатывать правильно, это вызовет утечку памяти, которую трудно отследить.
Вы имеете в виду что-то вроде [умных указателей] (http://msdn.microsoft.com/en-us/library/hh279674.aspx)? 'std :: unique_ptr doc (новый файл TiXmlDocument (file.c_str()));' –