Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2010, 09:11   #21
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
Извените что не в тему где можно найти нормальное описание структуры EXE?
Начнем с того, что exe бывают разные - MZ и PE. В этом направлении гуглите.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 13.11.2010, 09:24   #22
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Может конечно я туплю, но не понимаю идею всё равно.
Кнопка нужна форме, следовательно счетчик + 1. Форма нужна кнопке - следовательно счетчик + 1. Получаем, что форма не может удалиться, т.к. её счетчик равен 1 и та же ситуация с кнопкой.
Если я буду хранить список кнопок формы без увеличения счетчиков, то они соберутся сборщиком и волшебным образом пропадут с экрана на глазах у удивленного пользователя.
1.
Цитата:
Кнопка нужна форме, следовательно счетчик + 1
Верно, при создании новой кнопки вызывается alloc => counter = 1
2.
Цитата:
Форма нужна кнопке - следовательно счетчик + 1
Зачем это? Форма вообще не нужна кнопка, кнопка по сути отдельный объект как и форма. У формы уже есть один объект с counter = 1, зачем еще раз увеличивать counter?
3.
Цитата:
Если я буду хранить список кнопок формы без увеличения счетчиков, то они соберутся сборщиком
Нет. Ибо при создании (alloc) кнопки у него counter = 1, сборщик не сможет убить эту кнопку, counter ведь не равен 0.
4. Во время удаления формы, можно просто пробежатся по списку контролов и у каждого вызвать release, т.е. уменьшить counter на 1, т.к. по сути все что было добавлено во время инициализации формы и после, все объекты, они были добавлены через alloc либо через retain, что значит каждый был добавлен с +1 к counter'у. Значит логично все в списке -1 от counter'a. Соответственно, если объект более никуда не ссылается, counter = 0 и объект будет уничтожен, это к примеру наша кнопка, которая ничего не делает на форме, она была создана во время инициализации формы (alloc => counter = 1) и при удалении формы release из списка => counter = 0 => free.

Надеюсь ясно вы просто не много не понимаете идею, ибо она очень отличается от идей языков delphi/c++/c# и многие другие.

UPD:
Код:
// view/form/window
--Window
----------Okay
----------Cancel

...

// code related to view/form/window
Window *Window;
Button *Okay;
Button *Cancel;

// initialization
void Init {
  Window = Window.alloc;
  Okay = Button.alloc;
  Cancel = Button.alloc;

  Window.list.add(okay);
  Window.list.add(cancel);
}

void AddControl(Button *Button) {
  // new control, no matter how many links it already has
  Window.list.add(Button.retain); // add to list with growing counter of the button
}

void Dealloc {
  // okay.release;
  // cancel.release;
  foreach (element in Window.list) {
    element.release;
  }
  Window.release;
}
Вот и все думаю так яснее. Это я так схематически можно сказать сделал, разумеется в реале, Window объект это this(C++), self(Delphi) и т.п. т.е. не надо писать Window.XXX и освобождать/создавать Window.

Последний раз редактировалось BOBAH13; 13.11.2010 в 09:36.
BOBAH13 вне форума Ответить с цитированием
Старый 13.11.2010, 09:29   #23
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

BOBAH13, мозг у меня совсем не работает, поэтому так я до конца идею и не понял. Ну да ладно. Может когда-нибудь до Objective C руки дойдут, там со сборщиком и разберусь. До меня теория без практики туго доходит
pu4koff вне форума Ответить с цитированием
Старый 13.11.2010, 12:25   #24
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
А вот вопрос, это язык компилируемый я так понимаю? Вы в итоге напишите интерпретатор который будет переводить ваш код(язык) в asm, а потом используя какой либо asm компилятор компилировать уже в бинарный код? Или идея в чем то другом?
компилируемый.
да сначало в асм потом в bin, хочу написать компиль асма к нему, чтоб он сам мог это все сделать.
ну и линкер(но это проще чем компиль асма)
Цитата:
Извените что не в тему где можно найти нормальное описание структуры EXE?
http://www.microsoft.com/whdc/system...re/pecoff.mspx
Цитата:
new есть. delete - нет. Значит утечка будет.
хочу уточнить, утечка будет изза того что начальный b не удаляется?(теряется ссылка на него)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.11.2010, 12:42   #25
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
хочу уточнить, утечка будет изза того что начальный b не удаляется?(теряется ссылка на него)
Нет. Утечка будет из-за создаваемой в операторе переменной t. Память под неё выделили, вернули указатель из неё, но в b скопируется не ссылка, а сам объект t через конструктор копии. Так что там возвращать нужно не ссылку, а значение, т.е. объект.
pu4koff вне форума Ответить с цитированием
Старый 13.11.2010, 13:16   #26
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а можно примерчик небольшой?
(конечно вообще там правильно += применить, но в данный момент не суть)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.11.2010, 13:54   #27
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Как-то так:
Код:
A operator + (int i)
{
  A t(*this);  // создаём копию объекта, к которому прибавляем число
  t.d += i;  // собственно прибавление числа
  return t; // возвращаем результат. По сути тут сработает конструктор копии result(t)
}
Проблема будет с большими объектами, т.к. в данном случае получается создание 2-х временных объектов.
pu4koff вне форума Ответить с цитированием
Старый 13.11.2010, 16:14   #28
still_alive
Great Code Monkey
Форумчанин
 
Аватар для still_alive
 
Регистрация: 09.08.2007
Сообщений: 533
По умолчанию

Цитата:
Сообщение от BOBAH13
Трудно представить где такое понадобится ведь все есть объект, а ссылка есть ссылка. Зачем ссылка на ссылку? если нужна копия объекта, object retain. И все дела.
Для копии скорее copy, а не retain.
Итак, внутри объекта 1 указатель на объект 2. Внутри объекта 2 указатель на объект 1.
Нужно очень часто: как минимум при управлении кэшируемыми объектами и при реализации паттернов Composite/Observer/MVC.
Для примера рассмотрим Observer. Пусть у нас есть наблюдатели (скажем, куча таблиц и диаграмм) и субъект (данные). Внутри каждого наблюдателя должен быть указатель на субъект, внутри субъекта - список указателей на наблюдателей.
Получаем циклические ссылки (или по документации Mac OS X Reference Library - Retain Cycles) - а это недопустимо.
В той же документации (секция Weak References to Objects) предлагается следующее решение проблемы - не делать retain на наблюдателей, а просто внутри субъекта хранить слабые указатели на них.
Недостаток такого решения очевиден (правда есть и другое решение, а именно использование __weak, но оно уже полностью связано с GC) - если клиентский код удалил какого-нибудь наблюдателя, но забыл об этом оповестить субъект, то после следующего обновления данных субъект, пытаясь оповестить об изменении данных всех наблюдателей, наткнется на удаленного наблюдателя и программа вылетит.
В Objective C за этим надо следить ручками, а в C++ эту проблему прекрасно решает boost::weak_ptr.

Цитата:
Сообщение от BOBAH13
Надеюсь ясно вы просто не много не понимаете идею, ибо она очень отличается от идей языков delphi/c++/c# и многие другие.
Не понимаю, чем Reference Counting принципиально отличается во всех этих языках.
still_alive вне форума Ответить с цитированием
Старый 13.11.2010, 18:18   #29
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Проблема будет с большими объектами, т.к. в данном случае получается создание 2-х временных объектов
получается что лучше б было +=?
(глупые вопросы, но хочу быть увереннее)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.11.2010, 22:43   #30
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
получается что лучше б было +=?
(глупые вопросы, но хочу быть увереннее)
Да. Там без временных объектов можно обойтись.
Кстати, раз уж затронули эту тему... минус перегрузки операторов, используемой в плюсах, в дублировании кода.
Программисту логично, что b = b + 1 и b += 1 это одно и то же, а вот для компилятора это совершенно разные вещи. Можно конечно выражать += через оператор +, но тогда код будет далеко не самым оптимальным.
Есть повод подумать над своей гениальной перегрузкой, чтобы и без дублирования и не зависеть от порядка переменных (в С++ а + b не всегда тождественно b + a, если a и b разных типов, т.к. будут использоваться разные варианты перегрузки +).
За это я и не люблю С++. Язык позволяет многое, но по сути это выливается в кучу граблей и приходится самого себя ограничивать, дабы лоб не разбить. Так что думайте над своим творением более тщательно, чтобы потом не пришлось баги фичами называть
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
можно ли подобный текст перевести на человеческий язык? alexxx777 Помощь студентам 0 24.05.2010 19:56
Как создать вид подобный SolidWorks. KemanSR Общие вопросы C/C++ 6 04.05.2010 21:30
Добавить модуль в phpnuke-подобный движок Able2Know Фриланс 3 23.04.2010 16:29
В Access есть тип данных "Счетчик".Есть ли подобный тип данных в MS Sql Server 2000? An_ton SQL, базы данных 5 16.01.2009 17:55