Re: собственный heap-менеджмент.
От: Аноним  
Дата: 16.11.08 21:01
Оценка: +1
Здравствуйте, Аноним, Вы писали:

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


Что тут пинать? Это бред и ламерство.
собственный 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
Третий: интересны ваши комментарии к реализации и вообще идее
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
А>Третий: интересны ваши комментарии к реализации и вообще идее
---
С уважением,
Сергей Мухин
Re: собственный heap-менеджмент.
От: _Ursus_  
Дата: 16.11.08 15:31
Оценка:
Иде ж тут удобства? Где идеи из Java?
Мож, я не очень внимательно смотрел... поясните
Re: собственный heap-менеджмент.
От: Аноним  
Дата: 16.11.08 15:32
Оценка:
А>Первый, самый важный, наверное простой, но мне непонятный. конструкция type *var = new type(parameters...); выделяет память и сразу вызывает конструктор. Как на с++ вызвать конструктор на участок памяти? ну то есть type *var = (type*)gAlloc(sizeof(type), L"MY_FIRST_VAR"); выделит память, а конструктор-то как вызвать к этой переменной?

type *var = (type*)gAlloc(sizeof(type), L"MY_FIRST_VAR");
var->type::type(parameters);


так что-ли? Это никаких лишних временных структур не создает? Я не из жадности к памяти, а просто интересно. Конструктор ведь только инициализирует, но не выделяет память, да?
Re[2]: собственный heap-менеджмент.
От: Аноним  
Дата: 16.11.08 15:41
Оценка:
Ну для меня удобства следующего рода:
1) Видны сразу все утечки памяти. По комментариям к указателям.
2) Виден объем занимаемой памяти.
3) Вся выделенная память удобно дампается на винт.

Вы меня простите, за громкое сравнение с Java, просто аналогия мне показалась хорошей.
Re[3]: собственный heap-менеджмент.
От: Сергей Мухин Россия  
Дата: 16.11.08 16:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ну для меня удобства следующего рода:

А>1) Видны сразу все утечки памяти. По комментариям к указателям.
А>2) Виден объем занимаемой памяти.
А>3) Вся выделенная память удобно дампается на винт.

А>Вы меня простите, за громкое сравнение с Java, просто аналогия мне показалась хорошей.


— thread safe?
— сколько дополнительной памяти?
— сколько дополнительных инструкций на аллокацию? на доступ?
— какая скорость освобождения? Т.е на 100 т. будем пробенать 50 т. раз на КАЖДОЕ освобождение
— какие MessageBox? т.е. нельзя выполнять на сервере (без desktop) или например для сервиса?

ну и мелочи
— лучше const wchar_t*
— this->comment не проше ли давать разные имена?
— тип g4 — таки не объявлен. Было бы интересно и его видеть
— строка g4 len; for (len = 0; comment[len] != L'\0'; len++);
можно заменить на wcslen
— не понятно, почему "основные ф-ии" не в классе?
— а это вообще 5 баллов "Убиваемый указатель не выделялся или уже убит"

---

в общем бред
---
С уважением,
Сергей Мухин
Re[2]: собственный heap-менеджмент.
От: VoidEx  
Дата: 16.11.08 20:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>Первый, самый важный, наверное простой, но мне непонятный. конструкция type *var = new type(parameters...); выделяет память и сразу вызывает конструктор. Как на с++ вызвать конструктор на участок памяти? ну то есть type *var = (type*)gAlloc(sizeof(type), L"MY_FIRST_VAR"); выделит память, а конструктор-то как вызвать к этой переменной?


void *mem = gAlloc(sizeof(type), L"MY_FIRST_VAR");
type *var = new (mem) type(parameters);


Так. А удалять так:
var->~type();
gFree(var);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.