Как понять где вызывается оператор delete[]

Тема в разделе "WASM.BEGINNERS", создана пользователем galenkane, 16 ноя 2022.

  1. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    302
    Ловлю ошибку без использования CRT в Visual Studio

    error LNK2001: unresolved external symbol "void __cdecl operator delete(void *,unsigned __int64)" (??3@YAXPEAX_K@Z)

    Как понять в каком месте в коде вызывается этот оператор?
     
  2. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Собирать по частям, отсекая половину кода, ловить льва в пустыне?
    #define delete *что_нибудь_с_ошибкой* ?

    Впрочем я ненастоящий сварщик, может товарищ тимлид Rel даст совет получше.
     
  3. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    462
    Так прямо перед этой ошибкой разве не написано имя модуля в которой она произошла?
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Естественно. Вообще, если уж использовать Плюсы без CRT, что мешает переопределить операторы new/delete через условные HeapAlloc/HeapFree, как бы можно, конечно, все классы на стеке держать или руками конструкторы/деструкторы вызывать, когда выделил/освободил память под класс и массив классов, но с операторами new/delete это удобнее, тк конструкторы и деструкторы в этом случае компилятор сам вызовет (ну точнее код для их вызова сгенерирует). Реализовать эти операторы - пара-тройка строк кода для каждого из них. И да, delete и new вроде в Плюсах неявно не вызываются, то есть они должны быть в коде, другое дело, что они могут быть где-то глубоко в кодах шаблонных классов, а код шаблонного класса попадает в объектник, где он используется, так что этот вызов может быть далеко не в том цпп-файле, объектник которого не линкуется. Например, в каких-то смарт-указателях, но зачем писать без CRT и использовать смарт-указатели тогда?
     
    Последнее редактирование: 16 ноя 2022
    sniper нравится это.
  5. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    По большому счёту выкинуть црт и пытаться использовать другие стандартные библиотеки это дохлый номер, ну может не совсем дохлый но явно не для начинающих.
    Первым делом что нужно выкинуть после црт это стандартную инициализацию, соответственно забыть про (argv, argc) и все что к ним прилагается.
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Из всяких STL'ей и Boost'ов будет работать очень мало чего, тк там многое завязывается на исключения и те же операторы (даже некоторые вещи могут быть повязаны на RTTI), которые очевидно зависят от стандартных библиотек. Если операторы достаточно просто сделать руками и это не много кода, то реализация исключений (даже простая реализация через SEH) и разматывание стека, это довольно много кода, косяк в котором может привести к сложно отлаживаемым багам, я бы никому не советовал этим заниматься.
     
  7. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Так-то мне встречались и stl и boost с оригинальными имплементациями црт адаптированными под всякие извраты вроде ядра и прошивок, и к слову все работало на удивление стабильно и даже без особых тормозов. Но там было видно что прошлись титаны и отловили все варианты при которых шаг влево вправо расстрел без предупреждения.
     
  8. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    https://learn.microsoft.com/en-us/c...rors/linker-tools-error-lnk2001?view=msvc-170
     
  9. RCE

    RCE Member

    Публикаций:
    2
    Регистрация:
    22 сен 2022
    Сообщения:
    41
    Пробуйте статическую и динамическую линковку /MD или /MT. Отключите /Gs
    На крайний случай есть же либы, которыми можно заменить CRT
    Они статически линкуются и не требуют VS рантайм
     

    Вложения:

    • Lib.7z
      Размер файла:
      152,2 КБ
      Просмотров:
      97
    Последнее редактирование: 16 ноя 2022
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    О годные советы подвезли, удивительный, конечно, человек, каждый его пост такой толковый, генератор толка на форуме, хорошо, что такой есть.
     
  11. RCE

    RCE Member

    Публикаций:
    2
    Регистрация:
    22 сен 2022
    Сообщения:
    41
    Rel, Ты как прям критик Латунский из Мастера и Маргориты :)
     
  12. galenkane

    galenkane Active Member

    Публикаций:
    0
    Регистрация:
    13 янв 2017
    Сообщения:
    302
    определил функцию прямо в коде

    помогло
     
    ormoulu нравится это.
  13. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    и как сие понимать
    написали пустой оператор делит?
     
  14. RCE

    RCE Member

    Публикаций:
    2
    Регистрация:
    22 сен 2022
    Сообщения:
    41
    alex_dz, и как сие понимать
    - у Вас прямо это тактическая фраза, (( сарказм
    Чел просто не очень шпарит и сделал статик линковку, см мой совет
     
  15. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    :good:

    Надо б проверить что утечка памяти не получается в результате, ну если по-хорошему.
    --- Сообщение объединено, 19 ноя 2022 ---
    Хотя если на отсутствие new не ругалось, наверное все нормально.
     
  16. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.330
    Вообще, кто-то может вспомнить в Плюсах такую ситуацию, когда delete применяется на объекте, созданным без new, и это типа нормально? Если только он руками выделил память под массив и для всех элементов массива повызывал конструкторы, то есть симулировал new.
     
  17. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Линкуется != вызывается, вполне вероятен вариант когда какая-то библиотека, хедер, макрос и т.п. хочет delete для объекта который не создаёт, при этом оно только компилится но никогда не выполняется.
     
  18. alex_dz

    alex_dz Active Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    458
    тогда убрать код к черям собачим раз наперед известно что он мертв!
     
  19. RCE

    RCE Member

    Публикаций:
    2
    Регистрация:
    22 сен 2022
    Сообщения:
    41
    может просто полную оптимизацию поставить:
    "Использовать создание кода во время компоновки"
    /Ox /Gs- /Gy /Gm-
    Ну и в линкере
    /OPT:REF /OPT:ICF /LTCG
    __
    кстати
    /OPT:REF - отключает ликовку с не используемыми функциями
     
    Последнее редактирование: 19 ноя 2022
  20. ormoulu

    ormoulu Well-Known Member

    Публикаций:
    0
    Регистрация:
    24 янв 2011
    Сообщения:
    1.208
    Чтобы убрать код, нужно как минимум его найти, а с этим у автора затруднения.
     
    M0rg0t нравится это.