CLR мешает C ++ STD? - PullRequest
       13

CLR мешает C ++ STD?

3 голосов
/ 04 мая 2009

У меня есть код, компилируемый под clr, и другой код, который не управляется в одном проекте.

Мой файл common.h содержит все необходимые мне заголовки библиотеки std. Он включен в manager.h (предварительное объявление для manager.cpp (без CLR)), который включен в main_window.h (WinForm), который включен в document_manager.cpp (CLR).

Во время выполнения я получаю все виды странного поведения, в одном случае моя форма не загружается. Приостановка программы для отладки несколько раз показала, что она зависла, перераспределяя память для std :: string, в malloc.c. Изменяя код, я могу получить исключение System :: InvalidMemory (я думаю) в ostream.

Как мне остановить CLR от управления библиотекой std?

Если кому-то понадобится источник моих файлов, просто спросите.

Edit: В callstack у меня есть некоторый управляемый код, который запускается при загрузке моей формы. В обратном вызове инициализации окна у меня есть собственный переход, а затем мой класс менеджера. Позже я доберусь до

    std::string error_msg;
    error_msg = "Storage Manager: SQLite Error ("; <-- Executing Currently
    error_msg += sqlite3_errcode(this->db_p);
    error_msg += ") - ";
    error_msg += sqlite3_errmsg(this->db_p);
    *(this->log) << error_msg.c_str() << std::endl;

и в callstack отображаются std :: basic_string :: assign, затем некоторые другие std :: functions и, наконец, функция malloc, в которую она постоянно вставляется.

Edit: Исключение, которое выдается при записи в файл:

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at manager.file_open(manager* , basic_string<char\,std::char_traits<char>\,std::allocator<char> >* )
   at DocumentManager.main_window.file_open_mainmenu_Click(Object sender, EventArgs e) in c:\development\document manager\document manager\main_window.h:line 456
   at System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
   at System.Windows.Forms.ToolStripMenuItem.OnClick(EventArgs e)
   at System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
   at System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
   at System.Windows.Forms.ToolStripItem.FireEventInteractive(EventArgs e, ToolStripItemEventType met)
   at System.Windows.Forms.ToolStripItem.FireEvent(EventArgs e, ToolStripItemEventType met)
   at System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
   at System.Windows.Forms.ToolStripDropDown.OnMouseUp(MouseEventArgs mea)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ToolStrip.WndProc(Message& m)
   at System.Windows.Forms.ToolStripDropDown.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Ответы [ 3 ]

2 голосов
/ 04 мая 2009

Вы пытались обернуть #pragma неуправляемым / #pragma управляемого вокруг функций, которые вам нужны, чтобы остаться неуправляемыми? Несмотря на то, что http://www.ondotnet.com/pub/a/dotnet/2003/03/03/mcppp2.html написано в некотором роде «бездыханного энтузиазма», в нем есть несколько советов по смешению управляемого и неуправляемого кода / объектов.

1 голос
/ 04 мая 2009

Я думаю, что вы можете быть затронуты одним правилом определения из вашего описания. В C ++ вам разрешено иметь несколько определений для класса, но все они должны быть идентичными. Это позволяет вам помещать определения классов в заголовки.

Вы все еще должны быть осторожны с "идентичной" частью. Это означает не только токены в исходном коде, но и их замену после prceprocessor и (на практике) их значение с учетом текущих настроек компилятора. Ярким примером может служить переключение 32/64 бит или настройка выравнивания - они могут изменить размер класса.

В вашем случае у вас может быть два определения классов Microsoft's STL при разных настройках.

0 голосов
/ 04 мая 2009

Просто выстрел в темноте, но попробуйте отключить поддержку CLR для файлов CPP, в которых вы используете STL. Этот вопрос показывает, как это сделать для отдельных файлов CPP. Он эффективно компилирует их.

Справедливое предупреждение: если вы идете по этому пути, вам, возможно, придется отключить предварительно скомпилированные заголовки для файлов CPP, которые вы скомпилировали изначально.

...