Проблема с использованием компилятора Intel C++ 16, обновление 3, в 32-разрядной версии
Мне было интересно, сталкивался ли кто-то с той же проблемой, которую я обнаружил вчера. Я использую ICC 16 (Intel C++ компилятор 16.0, обновление 3) на VS 2015. Я строю в 32 бит. Обратите внимание, что эта проблема не возникает в 64 битах.
Предположим, следующий код:
#include <iostream>
#include <memory>
using namespace std;
void func( shared_ptr<int> p )
{
if ( p == nullptr )
{
cout << "nullptr" << endl;
}
else
{
cout << "! nullptr" << endl;
}
}
//----------------------------------
int main( int argc, char* argv[] )
{
shared_ptr<int> i = nullptr;
// cout << "Hello!" << endl;
func( nullptr );
return 0;
}
Этот код работает правильно и выдает "nullptr".
Но если я раскомментирую cout "Hello!"<<endl;
, shared_ptr<int> p
передан в качестве аргумента func(...)
является недействительным, поэтому он не равен nullptr (видел в if{}else{}
) и происходит сбой при выходе из функции, потому что деструктор (из shared_ptr<int>
) не может быть выполнен должным образом.
Обратите внимание, что это не происходит при компиляции в 64 бит. В 64 битах он всегда работает правильно. Ошибка возникает только в 32 битах.
Я перепробовал много параметров сборки, но не смог найти ни одного подозреваемого. Кто-нибудь сталкивался с такой же ошибкой?
Кроме того, я знаю, что есть обновление 4 для ICC 16 (но мне пока не удалось его загрузить). Это обновление решает эту проблему?
Любая помощь будет оценена!
РЕДАКТИРОВАТЬ 1
Я исправил звонок func(nullptr)
, На самом деле я должен написать nullptr
непосредственно в (), не передавая автоматическую переменную.