2015-03-09 3 views
1

У меня есть следующий фрагмент кода деструктора в базовом классе «SceneNode», который пытается очистить его вектор-член и удалить объекты вектора, которые получены из SceneNode, но получить ошибку при Удаление ляющий> ToString линии, пожалуйста, вы можете указать в правильном направлении:Вызов метода производного класса из деструктора базового класса

SceneNode::~SceneNode() { 

LOG(DEBUG)<< "Node children size: " + to_string(children.size()) + " [" + toString() + "]"; 

// clean children nodes 
for (SceneNode* child : children) { 
    LOG(DEBUG) << "Deleting "; 
    LOG(DEBUG) << "Deleting " + child->toString(); 
    delete child; 
    LOG(DEBUG) << "Deleted " + child->toString(); 
} 

Когда я отладка, он показывает мне правильный производный объект есть:

Name : child 
Details:0x3204b40 
Default:0x3204b40 
Decimal:52448064 
Hex:0x3204b40 
Binary:11001000000100101101000000 
Octal:0310045500 

Name : lib::SceneNode 
Details:{_vptr.SceneNode = 0x4e3430 <vtable for lib::ImageSceneNode+16>, id = {static npos = <optimized out>, _M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x3204c08 "New Node"}}, position = {x = 0, y = 0}, size = {x = 1920, y = 1080}, center = {x = 960, y = 540}, rotation = 0, alpha = 255, enabled = true, visible = true, deleted = false, parent = 0x22fca0, children = {<std::_Vector_base<lib::SceneNode*, std::allocator<lib::SceneNode*> >> = {_M_impl = {<std::allocator<lib::SceneNode*>> = {<__gnu_cxx::new_allocator<lib::SceneNode*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}}, <No data fields>}, animators = {<std::_Vector_base<lib::NodeAnimator*, std::allocator<lib::NodeAnimator*> >> = {_M_impl = {<std::allocator<lib::NodeAnimator*>> = {<__gnu_cxx::new_allocator<lib::NodeAnimator*>> = {<No data fields>}, <No data fields>}, _M_start = 0x0, _M_finish = 0x0, _M_end_of_storage = 0x0}}, <No data fields>}, sceneManager = 0x22fc98} 
Default:{...} 
Decimal:{...} 
Hex:{...} 
Binary:{...} 
Octal:{...} 

Log:

2015-03-09 15:33:39,685 DEBUG [default] [] [virtual lib::SceneNode::~SceneNode()] [..\src\lib\scene\node\SceneNode.cpp:30] Node children size: 1 [SceneNode] 

2015-03-09 15:33:39,685 DEBUG [default] [] [virtual lib::SceneNode::~SceneNode()] [..\src\lib\scene\node\SceneNode.cpp:34] Deleting 

2015-03-09 15:33:39,685 FATAL [default] CRASH HANDLED; Application has crashed due to [SIGSEGV] signal 

Спасибо!

+2

Вы не можете сделать этого. Полученный класс уже уничтожен. –

+1

Я считаю, что есть и следствие конструкторов (т. Е. Вызов виртуальной функции производного класса не будет работать, потому что производный класс еще не построен). –

+0

Спасибо, теперь, если я удаляю вызовы с производными методами, это терпит неудачу, я думаю, что это моя оригинальная проблема, я поставил сумасшедшие заявления о регистрации, чтобы увидеть, что происходит: –

ответ

1

Первое изменение это:

LOG(DEBUG) << "Deleting " + child->toString(); 

к этому:

LOG(DEBUG) << "Deleting " << child->toString(); 

Затем удалите эту строку, так как в этот момент, что переменная была уничтожена, и вы не можете получить доступ к нему (это является причиной авария):

LOG(DEBUG) << "Deleted " + child->toString(); 
Смежные вопросы