Здравствуйте, Аноним, Вы писали:
А>Сразу прошу не пинать.
А>Идея такова — для удобной работы с динамической памятью в 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
А>Третий: интересны ваши комментарии к реализации и вообще идее