Я новичок в общих указателях и задавался вопросом, как инициализировать общий указатель, если он также является переменной-членом?C++ Xerces-c: Инициализация shared_ptr
В настоящее время мой код выглядит примерно так: В заголовочном файле, у меня есть:
class Parser {
public:
Parser();
~Parser();
boost::shared_ptr<XercesDOMParser> parser;
{
В конструкторе, у меня есть что-то вроде этого:
Parser::Parser()
{
try {
XMLPlatformUtils::Initialize();
} catch (...) {}
parser = shared_ptr<XercesDOMParser> (new XercesDomParser());
}
В деструкторе у меня есть :
Parser::~Parser() {
try {
XMLPlatformUtils::Terminate();
}catch(...) {}
}
Однако, скомпилировав программу с Valgrind, я бы принял e следующая ошибка: Вызывается чистый виртуальный метод. Прекращено без активного исключения. Недопустимое считывание размера 8.
Любое понимание того, что я могу делать с инициализацией неправильно?
Мое подозрение, что я читаю из нераспределенной памяти.
EDIT:
Так в деструкторе, я добавил следующие строки кода до прекратить утечку команд и памяти и ошибки исчезли!
если (парсер) parser.reset();
Почему все ссылки на синтаксический анализатор должны быть удалены, прежде чем его можно будет освободить?
Большое спасибо, спасибо.
Вы уверены, что проблема локализована в shared_ptr intialization? И вы уверены, что ошибка Valgrind в этой функции? Можете ли вы предоставить более подробную информацию о том, что называется виртуальной функцией? Чем больше деталей вы предоставляете, тем лучше мы сможем помочь. – templatetypedef
Я думаю, что проблема локализована только при инициализации. Если я прокомментировал 'parser = shared_ptr (новый XercesDomParser()); Вальгринд вернется без ошибок. Вся другая реализация в моем коде закомментирована, за исключением ctor и dtor, поэтому я не понимаю, откуда приходит виртуальная функция. –
user459811