Как исправить ошибку утверждения _CrtIValidHeapPoint (pUserData) в приложении c ++ winforms - PullRequest
3 голосов
/ 20 октября 2011

Впервые я использую такой сайт, но я сильно застрял. Следующий справочный раздел включен для полноты, поскольку я не уверен, что какое-либо из действий, описанных в нем, могло способствовать решению текущей проблемы, с которой я сталкиваюсь.

Фон

Мы с коллегой написали много кода на С ++ в консольном приложении (с настройками по умолчанию) в Visual Studio 2010 (полная версия) для университетского задания. Мы решили, что хотим попробовать свои силы в приложении winforms, и создали его в Visual Studio 2010 и импортировали весь наш код из консольного приложения. Мы столкнулись со следующими проблемами:

  1. Необходимо добавить наши включения в файл "stdafx.h", а затем #include "stdafx.h" во все наши файлы реализации (.cpp).
  2. В местах, где мы использовали строки c ++ (std :: string), нам пришлось перейти на строки управляемой системы (System :: String ^) для совместимости с CLR.
  3. Изменен параметр компиляции «Поддержка общеязыковой среды выполнения» на / clr вместо / clr: pure. Это было необходимо для устранения ошибок компоновки (LNK2028, LNK2019), которые были у нас с boost :: shared_ptr ...

После того, как мы сделали все вышеперечисленное, наш проект компилировался.

Проблема

Когда мы запускаем приложение, мы получаем следующую ошибку подтверждения:

_CrtIsValidHeapPointer (pUserData)

Это утверждение немедленно завершается неудачей, по-видимому, без выполнения какого-либо кода, поскольку, когда я устанавливаю точки останова в начале main, они не достигаются при отладке (стек вызовов пуст).

Единственный способ запустить приложение - установить для параметра CLR значение / clr: pure и полностью исключить использование boost.

У меня есть 3 вопроса:

  1. Код выполняется? Я знаю, что звучит невозможно, что утверждение может быть ошибочным без выполнения кода. Может быть, есть что-то, что случается перед основным?
  2. Что на самом деле означают параметры / clr и / clr: pure?
  3. Можно ли скомпилировать библиотеки boost для кода, совместимого с clr? Если это так, что может вызвать проблемы со ссылками?

Спасибо всем за ваше время, я не разместил ни одного кода, потому что я буквально не знаю, что отправлять ... Я понятия не имею, где возникает проблема. Если у кого-то есть предложения относительно того, какой код размещать, я открыт для них.

С уважением Брэд

Ответы [ 2 ]

1 голос
/ 20 октября 2011

Чтобы попытаться ответить на ваши конкретные вопросы:

  1. main() - это точка входа в ваш код, а не весь исполняемый файл.Может быть большой объем начальной инициализации, а также инициализации всех глобальных статических объектов.Например, в следующем примере функция запускается до ввода main:

       int SomeGlobal = SomeFunction();
    
       int main (void)
       {
       ...
       }
    
  2. У меня почти нулевой опыт работы с / clr, но я могу указать вам несколько полезных ссылок,Убедитесь, что вы понимаете все, что относится к вам в Как перейти на / clr и в настройках / clr .

  3. У меня опять нетпрямое знание, но этот пост форума на boost :: shared_ptr и этот вопрос SO на boost :: thread , похоже, указывает на наличие некоторых проблем.

Чтобы дополнительно диагностировать проблему, я бы попробовал несколько вещей:

  • Начните с пустого или "hello world" проекта CLR, чтобы убедиться, что он компилируется и запускается.
  • Попробуйтепростой пример с использованием boost и посмотрите, работает ли он вообще или дублирует проблему.
  • Попробуйте очистить и полностью перестроить приложение.
  • pUserData может быть из деструктора CString.Убедитесь, что все строки перенесены в строки управляемой системы.
  • Если вы работаете с простыми примерами, то это вопрос добавления к образцам до тех пор, пока вы не продублируете проблему, или удаления содержимого из приложения, пока проблема не исчезнет.
0 голосов
/ 03 июня 2015

Я знаю, что уже поздно, но я нашел этот вопрос, потому что у меня была та же проблема.

Глядя в другой проект, который я работаю (не мой), я обнаружил, что проблема связана с файлом: opencv_ts248d.lib. Если вы удалите его из своих зависимостей , он будет работать нормально (я не знаю почему, думаю, проблема в функции, которая ему принадлежит), поэтому у вас будут следующие:

opencv_calib3d248d.lib
opencv_contrib248d.lib
opencv_core248d.lib
opencv_features2d248d.lib
opencv_flann248d.lib
opencv_gpu248d.lib
opencv_highgui248d.lib
opencv_imgproc248d.lib
opencv_legacy248d.lib
opencv_ml248d.lib
opencv_nonfree248d.lib
opencv_objdetect248d.lib
opencv_ocl248d.lib
opencv_photo248d.lib
opencv_stitching248d.lib
opencv_superres248d.lib
opencv_video248d.lib
opencv_videostab248d.lib

(я просто включаю все их, не фокусируясь на том, что мне нужно, кроме той, которая приводит к проблеме)

Надеюсь, это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...