Integer нужен по причине, что терминал не позволяет выполнить new int.
он вообще много чего не позволяет ((
Integer нужен по причине, что терминал не позволяет выполнить new int.
он вообще много чего не позволяет ((
А зачем вообще выполнять new int!? Зачем использовать счетчик ссылок, если управление объектами по-хорошему делегируется контейнеру? Также Вы в курсе что существует стандартный и базовый класс всех классов CObject? Зачем строить еще одну железную дорогу, если одна уже есть и хорошо работает?
Понимаете, решить Вашу проблему можно двумя путями: разобраться в счетчике ссылок, а это сделать наверное кроме Вас никто не сможет. Либо провести несколько сеансов гештальт-терапии, и наконец осознать полную ошибочность выбранного Вами подхода.
З.Ы. Укажите пожалуйста, задачу, которую требуется решить представленными здесь кодами.
Сейчас чуть более внимательно присмотрелся к коду - ужасные ошибки. Такое ощущение что имеет место полное непонимание написанного кода, тем, кто его сам писал:
Pointer Object::doSomething() const { return new Object(); }
Где звездочка (Pointer может быть только указателем)? Нельзя вернуть Object вместо Pointer, если Object не наследуется от Pointer.
Сейчас чуть более внимательно присмотрелся к коду - ужасные ошибки. Такое ощущение что имеет место полное непонимание написанного кода, тем, кто его сам писал:
Где звездочка (Pointer может быть только указателем)? Нельзя вернуть Object вместо Pointer, если Object не наследуется от Pointer.
Pointer::Pointer(Object* o): obj(o), refCount(new Integer(1)) {}
А зачем вообще выполнять new int!? Зачем использовать счетчик ссылок, если управление объектами по-хорошему делегируется контейнеру? Также Вы в курсе что существует стандартный и базовый класс всех классов CObject? Зачем строить еще одну железную дорогу, если одна уже есть и хорошо работает?
Понимаете, решить Вашу проблему можно двумя путями: разобраться в счетчике ссылок, а это сделать наверное кроме Вас никто не сможет. Либо провести несколько сеансов гештальт-терапии, и наконец осознать полную ошибочность выбранного Вами подхода.
З.Ы. Укажите пожалуйста, задачу, которую требуется решить представленными здесь кодами.
new int нужен для разделения счетчика между Pointer'ами, по другому эта задача не решается.
Pointer и есть контейнер для управления объектами Object
Решаемая задача парсинг JSON; вместо Object'a наборы классов JSON, JSONObject, JSONArray, JSONString...
Возможно из-за длинного первого поста размылась сама суть проблемы.
Прошу обратить внимание на советника:
#property strict #include "Pointer_impl.mqh" void OnStart() { bool res; Pointer p(new Object()); // normal res = false || p.doSomething().getFalse(); // normal p.doSomething().getFalse(); // error res = true || p.doSomething().getFalse(); }
идентичные вызовы, половина из которых отрабатывает нормально, половина валится с ошибкой, и получается, что ошибка не в коде подсчета ссылок.
Причем с ошибкой валятся те примеры, которые не должны выполнятся из-за ленивых вычислений логических выражений (хотя, возможно, компилятор MT4 этими оптимизациями не заморачивается)
Возможно из-за длинного первого поста размылась сама суть проблемы.
Прошу обратить внимание на советника:
идентичные вызовы, половина из которых отрабатывает нормально, половина валится с ошибкой, и получается, что ошибка не в коде подсчета ссылок.
Причем с ошибкой валятся те примеры, которые не должны выполнятся из-за ленивых вычислений логических выражений (хотя, возможно, компилятор MT4 этими оптимизациями не заморачивается)
Ничего не смыслю в ООП, но, как я понимаю, объекты класса res имеют значение true, если некие другие объекты созданы успешно.
Смутно догадываюсь, что свойство p.doSomething().getFalse() характеризует отсутствие положительного исхода какого-то процесса, либо действия. назову соответствующую булеву переменную res1.
Теперь отследим логику представленной программы:
if( !res || !res1) OK;
if( !res1 ) OK;
if( res || !res1 ) !OK;
Меня бы за это линейкой по рукам хлестать не стали,- просто из бурсы выгнали бы в момент :(
ЗЫ: Возможно, эта тема просто не входит в круг моего понимания...
Integer нужен по причине, что терминал не позволяет выполнить new int.
он вообще много чего не позволяет ((
Хотя бы сделайте просто класс и в нем публичное свойство, его и плюсуйте/минусуйте. Вообще подход, который привел к такой потребности изначально неверен. Выглядит все вообще, как будто запредельный сверх-экстра-супер мастер ООП кодил, даже страшно рядом стоять. Но почему супер герой задает вопросы?
Зачем создавать новый счетчик? Счетчик чего для чего? Вот что он считает. Почему его не сделать полем какого-то класса?
Я написал простенькую реализацию shared_ptr для управления динамически создаваемыми объектами.
В целом все работает отлично. Но. При непонятных условиях происходит незапланированное удаление счетчика ссылок, после чего возникает ошибка invalid pointer access;
Я вставлял диагностические сообщения перед оператором delete refCount, но до возникновения ошибки этот участок кода не вызывался, получается удаление происходило за пределами класса Pointer.
Я как смог минимизировал контекст возникновения ошибки, но что делать дальше, ума не приложу. Поведение очень странное.
Советник, который продемонстрирует условия возникновения ошибок:
Смущает то, что часть практически идентичных примеров работает, часть -- нет.
К сообщению прикрепил архив, чтобы можно было все ручками пощупать, через дебаггер пропустить. Сам я зашел в тупик.
Код класса Object:
Код класса Pointer:
Код класса Integer:
В Вашем коде нет ошибок. Пишите в сервисдеск.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Я написал простенькую реализацию shared_ptr для управления динамически создаваемыми объектами.
В целом все работает отлично. Но. При непонятных условиях происходит незапланированное удаление счетчика ссылок, после чего возникает ошибка invalid pointer access;
Я вставлял диагностические сообщения перед оператором delete refCount, но до возникновения ошибки этот участок кода не вызывался, получается удаление происходило за пределами класса Pointer.
Я как смог минимизировал контекст возникновения ошибки, но что делать дальше, ума не приложу. Поведение очень странное.
Советник, который продемонстрирует условия возникновения ошибок:
Смущает то, что часть практически идентичных примеров работает, часть -- нет.
К сообщению прикрепил архив, чтобы можно было все ручками пощупать, через дебаггер пропустить. Сам я зашел в тупик.
Код класса Object:
Код класса Pointer:
Код класса Integer: