2015-04-12 2 views
0

Я пишу проект C++ с Visual Studio 12.0 в Windows 8.1.Visual Studio, Debug Assertion Failed, MSVCP120D.dll

Казалось бы, из ниоткуда, следующий код:

int main() 
{ 
    std::fstream file_out("test.dat", ios::out | ios::binary | ios::trunc); 
    std::vector<bool> a(100, true); 
    file_out.write((char*)&a[0], 100 * sizeof(bool)); 
    file_out.close(); 

    std::fstream file_in("test.dat", ios::in | ios::binary); 
    std::vector<bool> b(100, false); 
    file_in.read((char*)&b[0], 100 * sizeof(bool)); 
    file_in.close(); 

    return 0; 
} 

дает мне следующее сообщение об ошибке во время выполнения:

Debug Assertion Failed! 

Program: C:\Windows\SYSTEM32\MSVCP120D.dll 
File: C:\Program Files (x86)\Microsoft Visual Studio 
12.0\VC\include\xutility 
Line: 201 

Expression: ITERATOR LIST CORRUPTED! 

Но только при запуске в режиме отладки; в режиме выпуска он работает нормально.

Однако, в режиме отладки, следующий код мчит штраф (изменено на Int вектор, а не вектор BOOL):

int main() 
{ 
    std::fstream file_out("test.dat", ios::out | ios::binary | ios::trunc); 
    std::vector<int> a(100, true); 
    file_out.write((char*)&a[0], 100 * sizeof(int)); 
    file_out.close(); 

    std::fstream file_in("test.dat", ios::in | ios::binary); 
    std::vector<int> b(100); 
    file_in.read((char*)&b[0], 100 * sizeof(int)); 
    file_in.close(); 

    return 0; 
} 

Что является причиной этой ошибки?

+0

Не используйте стили C. Используйте C++ cast. Если вам нужен 'reinterpret_cast', чтобы заставить его строить, вы, вероятно, имеете что-то неправильно. Причина в том, что в этом случае 'std :: vector ' сломан на C++ и хранит данные как битовый набор, а не массив bool. –

ответ

0

Ваш код предполагает, что std::vector<bool> a(100) создает вектор, который содержит смежный массив, равный 100 * sizeof(bool) байт. Это неверно.

Проще говоря, std::vector<bool> является специализированной версией вектора. Это не просто массив из bool, который завернут в класс.

http://en.cppreference.com/w/cpp/container/vector_bool

Предполагая, что ваш размер массива всегда будет постоянным, одно решение просто объявить

bool a[100];

или

std::array a<bool, 100>

, где на самом деле у вас есть массив из 100 bool типов.

Смежные вопросы