собственный heap-менеджмент.
От: Аноним  
Дата: 16.11.08 15:03
Оценка:
Сразу прошу не пинать.
Идея такова — для удобной работы с динамической памятью в C++, набросаль небольшой модуль, ниже приведены кусочки из него, который черпает идеи из Java, разве что сам память не чистит (мне это не нужно), зато например позволяет сразу найти утечки памяти...

/*Основные положения моего указателя*/
struct gPointer {
    void *address;
    wchar_t *comment;
    gPointer *prev, *next;
    void set(g4 size, wchar_t* comment) {
        address = new g1[size];
        g4 len; for (len = 0; comment[len] != L'\0'; len++);
        this->comment = new wchar_t[len + 1];
        memcpy(this->comment, comment, sizeof(wchar_t) * (len + 1));
    }
    gPointer(g4 size, wchar_t* comment) { set(size, comment); }
    gPointer(g4 size, wchar_t* comment, gPointer *prev) {
        set(size, comment);
        this->prev = prev;
        this->next = prev->next;
        next->prev = prev->next = this;
    }
    ~gPointer() {
        delete[] address;
        delete[] comment;
        prev->next = next;
        next->prev = prev;
    }
};
/*основные функции*/
gPointer *first = NULL, *last = NULL;
void gInitPointers() {
    first = new gPointer(1, L"HEAD_POINTER");
    first->next = last = new gPointer(1, L"TAIL_POINTER");
    last->prev = first;
}
void *gAlloc(g4 size, wchar_t *comment) {
    last->prev = new gPointer(size, comment, last->prev);
    return last->prev->address;
}
void gFree(void *pointer) {
    for (gPointer *curr = first->next; curr != last; curr = curr->next)
        if (curr->address == pointer) {
            delete curr;
            return;
        }
    MessageBox(0, L"Убиваемый указатель не выделялся или уже убит", L"", 0);
}
void gListPointers() {
    if (first->next == last) {
        MessageBox(NULL, L"MEMORY CLEAR", L"Information", MB_ICONINFORMATION);
        return;
    }
    for (gPointer *curr = first->next; curr != last; curr = curr->next) {
        MessageBox(NULL, curr->comment, L"gPointer", MB_ICONINFORMATION);
    }
}

Вопросы.
Первый, самый важный, наверное простой, но мне непонятный. конструкция type *var = new type(parameters...); выделяет память и сразу вызывает конструктор. Как на с++ вызвать конструктор на участок памяти? ну то есть type *var = (type*)gAlloc(sizeof(type), L"MY_FIRST_VAR"); выделит память, а конструктор-то как вызвать к этой переменной?
Второй, менее важный — можно как-нибудь #define'ом переделать оператор new во всем исходнике в вызов моего gAlloc? В данный момент я просто язаю ctrl+f
Третий: интересны ваши комментарии к реализации и вообще идее
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.