LINUX.ORG.RU

Может я что-то не так понимаю про конструкторы?


0

0

Появилась проблема, сначала все было ОК, компилировалось и выполнялось, потом вдруг стало выдавать сегментэйшн фолт.
Результаты отладки в GDB:


int main() {
  Openbox::RC rc; 
  ...

--->
Openbox::RC::RC() {
  SingleNode* new_node = new Openbox::NumberNode(xml_doc, 
    "resistance/strength", "resistance to screen border (pixels)",
    11);
--->

Openbox::NumberNode::NumberNode(xmlDocPtr doc, std::string path,
  std::string desc, int value)
: SingleNode(doc, path, desc), i_value(value) {

--->
Openbox::SingleNode::SingleNode(xmlDocPtr doc,                                 std::string path, std::string desc) 
: Node(doc, path, desc) {}

--->
Openbox::Node::Node(xmlDocPtr doc, std::string path,
  std::string desc) 
: xml_doc(doc), str_path(path.c_str()), str_desc(desc.c_str()),
  xml_node(find_node(xml_doc)), 
  str_name((const char*) xml_node->name) {}

--->
xmlNodePtr Openbox::Node::find_node(xmlDocPtr doc) {
  int sz = str_path.size(); // ! здесь

  и вот в этом месте, Segmantation fault
  смотрю значение str_path._M_dataplus._M_p
  = (char*) 0x69666E6F (Address 0x69666E6F out of bounds)
(отладка в врапере Insight для GDB)
Что не так с [std::string str_path] ?
Это protected член класса Node.

Наследование такое 
class Node;
class SingleNode: public Node;
class NumberNode: public SingleNode;

class RC - сам по себе.

★★

у тебя создается временный обйект string от которого openbox ребята берут c_str(). После этого ты свой временный стринг униchтожаешь

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

тут написана последняя версия. Перед этим была везде инициализаци от стринг, т.е.

str_path(path) и str_desc(desc) то же самое.

Помогает только вообще убрать эти переменные из списка инициализации и вставить в тело конструктора:

str_path = path; str_desc = desc;

Но мне не понятно почему.

hapchu ★★
() автор топика
Ответ на: комментарий от hapchu

я не понял в чем конкретно ошибка.

Списки инициализации отрабатывают в порядке перечисления в классе а не в конструкторе. И вообще пока отрабатывает список инициализации объект не считается сформированным и это дурной том вызывать для него методы (как find_node у тебя)

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

> я не понял в чем конкретно ошибка.

в смысле если у тебя в классе xml_doc стоит после xml_node то у тебя проблема.

Не пишут так.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Спасибо, я понял. Просто считал, что инициализируются в порядке перечисления в конструкторе.

hapchu ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.