Re: собственный heap-менеджмент.
От: Сергей Мухин Россия  
Дата: 16.11.08 15:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Сразу прошу не пинать.

А>Идея такова — для удобной работы с динамической памятью в 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...
Пока на собственное сообщение не было ответов, его можно удалить.