Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вы так и не поняли. Я указал на проблему именно в Вашем коде
В текущей реализации Вашего компилятора просто возвращается ссылка на область константных строк. Область константных строк в текущей реализаци Вашего компилятора постоянно загружена в память и постоянно доступна.
Повторяю - это именно благодаря текущей реализации Вашего компилятора, которая несколько противоречит стандарту C++, ибо Вы оперируете с автоматическими локальными переменными, время жизни которых - от момента объявления до выхода из блока.
Компилятор MSVC++ противоречит стандарту C++... гениально.
Любой С-код компилируется в машкод, где любая строковая константа и есть адрес. И будет она существовать в сегменте данных с момента загрузки DLL до момента высвобождения памяти.
А то что она (константа) используется в функции так сказать "локально", это не значит что она там определяется фактически. Декомпилируйте DLL и сами увидите.
Но это уже совсем другая история.
Компилятор MSVC++ противоречит стандарту C++... гениально.
Любой С-код компилируется в машкод, где любая строковая константа и есть адрес. И будет она существовать в сегменте данных с момента загрузки DLL до момента высвобождения памяти.
А то что она (константа) используется в функции так сказать "локально", это не значит что она там определяется фактически. Декомпилируйте DLL и сами увидите.
Но это уже совсем другая история.
Запросто. Нет ни одного промышленного компилятора, который соответствует стандарту на 100 процентов.
В данном случае противоречие лишь в том, что ссылка осталась жива. Но я не удивлюсь, если в очередной реализации какого-нибудь MSVC 2015 будет реализован garbage collection, который будет удалять память, на которую больше никто не ссылается.
А вот теперь Вы скажите, где проблема в нашем коде?
пальчиком ткните?
Запросто. Нет ни одного промышленного компилятора, который соответствует стандарту на 100 процентов.
В данном случае противоречие лишь в том, что ссылка осталась жива. Но я не удивлюсь, если в очередной реализации какого-нибудь MSVC 2015 будет реализован garbage collection, который будет удалять память, на которую больше никто не ссылается.
А вот теперь Вы скажите, где проблема в нашем коде?
пальчиком ткните?
Если да кабы... тема открыта по конкретной проблеме. Впервые вижу чтобы модератор сам в оффтопе оказывался.
За проблемы в коде не я начал говорить и не утверждал о существовании таковых изначально.
А вот Ваш *spar = L"content" как раз таки не станет переопределять длину строки, и если исходная строка была 3 символа (6 байт), то "content" - 14 байт будет затирать собой еще 8 байт.
Я же написал: "на скорую руку". Указал, что на самом деле содержимое строки записывается совсем не так. Смысл примера был в том, чтобы показать передачу строку по ссылке. То есть сама строка ко входу в функцию уже должна где-то существовать. Если же вернуть просто ссылку на строку, то получим проблему, которую Вы и подняли - ошибка доступа. Ведь строка, которую вернула функция GetStringValue, существовала только во время работы функции. После окончания исполнения функции строка уничтожается и на выходе получаем указатель на "молоко".
Я же написал: "на скорую руку". Указал, что на самом деле содержимое строки записывается совсем не так. Смысл примера был в том, чтобы показать передачу строку по ссылке. То есть сама строка ко входу в функцию уже должна где-то существовать. Если же вернуть просто ссылку на строку, то получим проблему, которую Вы и подняли - ошибка доступа. Ведь строка, которую вернула функция GetStringValue, существовала только во время работы функции. После окончания исполнения функции строка уничтожается и на выходе получаем указатель на "молоко".
Это не является причиной проблемы, о которой я говорю. Еще раз повторюсь, проблема в том что MT5 x64 build 1035 принимает неизвестно что вместо указателя на строку или же интерпретирует х.з. как этот указатель.
В реальном проекте все переменные, возвращаемые в MQL объявлены глобально, выделение памяти под контролем. Стандартный пример от MQ (писал выше) дает ту же ошибку.
Котлеты отдельно, мухи - отдельно. не нужно смешивать.
Дальнейшие дискуссии уже бессмысленны, т.к. от сервисдеск получен ответ.