Я написал несколько классов C++, в которых используются различные библиотеки C++. Я создал проект Windows Form и настроил его для успешного использования моих классов. Однако недавно я создал еще один класс С++, и теперь я постоянно получаю:
A first chance exception of type 'System.AccessViolationException' occurred in TEST_OCU.exe
что приводит к:
An unhandled exception of type 'System.TypeInitializationException' occurred in Unknown Module.
Additional information: The type initializer for '<Module>' threw an exception.
Программа еще даже не запущена, а новый проблемный класс C++ еще даже не создан. Если я закомментирую вызов new
и у меня будет только указатель на этот новый класс C++, все будет отлично компилироваться. НО, если где-то я делаю что-то вроде:
if(new_class_ptr != NULL)
new_class_ptr->SomeFunction() //It doesn't matter what function this is
Это вызовет эти нарушения снова
Некоторые факты:
- Компиляция и компоновка в порядке, похоже, это проблема времени выполнения.
- В моем решении используются неуправляемые библиотеки и классы C++ (которые я написал) и одна управляемая форма C++.
- До сих пор у меня не было никаких проблем, я некоторое время успешно использовал несколько библиотек C++. Это вызвано новым классом C++, который я недавно написал.
- Класс C++, который вызывает эти нарушения, использует
std::ifstream
для чтения в файле. Если я закомментируюstd::ifstream input_file(filename);
, мой проект Forms запустится успешно. - Если я использую класс C++ в простом проекте Win32, он прекрасно компилируется и работает с
std::ifstream
. - У меня есть сильное ощущение, что это связано с этим вопросом
Может ли кто-нибудь дать какой-либо совет? Спасибо
EDIT: я предоставляю некоторые части кода моей формы, которые у меня есть. RTSPConnection работает нормально, класс-нарушитель — RTPStream.
public ref class Form1 : public System::Windows::Forms::Form
{
public:
// ... Lots of generated code here ...
//Calls I've written
private: static RTSPConnection * rtsp_connection_ = NULL; //This class works
private: static RTPStream * rtp_connection_ = NULL; //This class does not
bool streaming_;
System::Threading::Thread^ streaming_thread_;
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
if(rtsp_connection_ == NULL)
{
rtsp_connection_ = new RTSPConnection("rtsp://192.168.40.131:8554/smpte");
streaming_ = false;
}
//if(rtp_connection_ == NULL)
// rtp_connection_ = new RTPStream("test");
}
private: System::Void Form1_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) {
if(rtsp_connection_ != NULL)
rtsp_connection_->StopStreaming();
}
private: System::Void button1_MouseClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e) {
if(!streaming_)
{
//Start Streaming
streaming_thread_ = gcnew Thread(gcnew ThreadStart(&Form1::WorkerThreadFunc));
streaming_thread_->Start();
this->button1->Text = L"Stop Streaming";
streaming_ = true;
}
else
{
//Stop Streaming
if(rtsp_connection_ != NULL)
rtsp_connection_->StopStreaming();
//THIS CALL RIGHT HERE WILL THROW AN ACCESS VIOLATION
if(rtp_connection_ != NULL)
rtp_connection_->StopStreaming();
this->button1->Text = L"Start Streaming";
streaming_ = false;
}
}
};
TEST_OCU.exe!<CrtImplementationDetails>::LanguageSupport::Initialize() Line 698 C++
- person Constantin   schedule 05.07.2012AccessViolationException
, вероятно, означает, что вы пытаетесь разыменоватьNULL
или неинициализированный указатель где-то в вашем коде C++. - person millimoose   schedule 05.07.2012std::ifstream input_file(filename);
, гдеfilename
— этоstd::string
. Несмотря на то, что эта строка никогда не достигается во время выполнения, закомментирование этой строки или изменение ее наstd::ifstream input_file();
устраняет нарушения.std::ifstream input_file;
не работает. - person Constantin   schedule 05.07.2012std::ifstream
, и он сработал.) Я хотел бы добавить, я написал обходной путь с использованием FILE и fread... но я бы предпочел используйте потоки С++ для чтения моих файлов... - person Constantin   schedule 05.07.2012Form1
имеет статические члены, но, похоже, не выполняет никакой статической инициализации, что и вызывает проблему. Выполняет лиRTPStream
статическую инициализацию? - person arx   schedule 05.07.2012if(rtsp_connection_ == NULL)
. В неуправляемом С++ это было бы нормально... разве это не работает в управляемом? Если я не запутался в том, что означает статическая инициализация. Я намеренно оставил указатель RTPStream равнымNULL
, чтобы показать, что мне не нужно создавать экземпляр класса RTPStream, чтобы вызвать AccessViolation (обратите внимание, что я ВСЕГДА проверяю, имеют ли указатели значение NULL перед их использованием). - person Constantin   schedule 05.07.2012static RTPStream *rtp_connection_ = NULL
. В: вы уверены, что в RTPStream нет статических классов, которые не являются указателями (т. е. которые могут быть непреднамеренно созданы при запуске программы)? - person paulsm4   schedule 05.07.2012FILE *fp
иfread
вместоstd::ifstream
. (Я не согласен с этим, я бы хотел, чтобы это было на С++). Также большое спасибо за то, что вы так отзывчивы до сих пор. - person Constantin   schedule 05.07.2012Form1
, но может быть вRTPStream
? - person arx   schedule 06.07.2012