C ++ new () падает перед вызовом ctor - PullRequest
1 голос
/ 04 апреля 2011

спасибо, что посмотрели на мою проблему.

У меня есть объект, который динамически создается в моей программе.Создание является частью цикла, и первая итерация работает нормально.

После создания базовый класс моего объекта добавляется на карту.

Вот пример кода:

public class Base {  
    Base() {
        // Add itself to a map
        Data::objects[key] = this;
    }
}

public class Derived : public Base {
    // This ctor only initialize one int field.
    Derived() : Base() {};
}

Вроде просто, не правда ли?

В моем коде я делаю Derived * d = new Derived(); и по какой-то глупой причине я получаю SIGSEGV.

Я попытался отладить его, но он даже не входит в ctor перед сбоем!

Вот мой стек вызовов, так что вы можете помочь мне лучше:

Адрес: @ 0x002c0000
ntdll!RtlReleasePebLock ()
Адрес: @ 0x0000000c по ​​адресу c: ... \ stl_deque.h: 514
msvrct! Malloc ()
libstdc ++ - 6! _Znwj ()
fu87 _ZSt4cerr (this = 0xbc1ad8, e = "// имя моего объекта //") в // имени моего объекта //. Cpp
... Другие мои строки.

Спасибо, Микаэль

{наслаждайтесь}

Редактировать: Добавление информации о карте

Карта расположена в классе данных, статически.

// Data.h
class Data {
    static map<int, Base*> objects;
}

// Data.cpp
#include "Data.h"
map<int, Base*> Data::objects;

// methods implementations

Как вы можетеразвратить кучу, как я могу найти коррупцию произошлод?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011

Была ли Data::objects инициализирована до создания ЛЮБОГО использования Base?

Вам не гарантируется, что объект класса objects был инициализирован всякий раз, когда у вас есть более чем одна единица перевода (чтение, .cpp файл) в конечной цели ссылки, если вы не приложили особых усилий для ее обеспечения. .

Большинство людей решают эту проблему с помощью статического класса, с помощью которого эта инициализация гарантированно произошла при первом использовании. Что-то вроде:

// untested code, typed in by hand, not compiled through a machine compiler.
class Base {
    public: static addObject(Base* that);
    Base::Base() { Base::addObject(this); }
};
class Derived: public Base {
    Derived::Derived() {}
};
//
// and in the .CPP for Base
namespace /* hidden */ {
    int object_number = 0;
    map<int,Base*> *objects = NULL;
}
void Base::addObject(Base* that) {
    // TODO: do something to avoid multi-thread issues if that is ever a concern
    if (!objects) {
        objects = new map<int,Base*>();
    }
    (*objects)[++object_number] = that;
}
2 голосов
/ 04 апреля 2011

Вы, вероятно, повредили кучу в какой-то момент до выделения, что вызывает сбой. Попробуйте запустить с valgrind , чтобы увидеть, в чем вы виноваты

...