Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Skifling

При чтении вектора из файла, открытого как бинарник - выскакивает Access violation writing location 0xFEEEFEEE

12.10.2014, 19:03. Показов 1227. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При чтении файла, открытого как бинарник в консольном приложении всё ок.

При чтении файла, открытого как бинарник в виндовом приложении выскакивает: Unhandled exception at 0x6B40CCD2 (msvcp110d.dll) in Window.exe: 0xC0000005: Access violation writing location 0xFEEEFEEE.
Ошибка выскакивает при вызове деструктора вектора (при выходе из блока или приложения).

Код консольного приложения:
C++
1
2
3
4
5
6
7
8
9
class test{
public:
    string s;
    vector<int> v;
    int i;
    float f;
    test (string _s, int _v, int _i, float _f) {s = _s; v.push_back (_v); i = _i; f = _f;};
    ~test () {};
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main (){
    string f = "f.dat";
    test a ("1", 2, 3, 4.0f);
    test b ("0", 0, 0, 0);
 
    ofstream out (f, ios::binary);
    out.write ((char *) &a, sizeof (test));
    out.close ();
 
    ifstream in (f, ios::binary);
    in.read ((char *) &b, sizeof (test));
    in.close ();
 
    cout << b.s << " " << b.v[0] << " " << b.i << " " << b.f << endl;
 
    while (1){}
    return 0;
}

Код вин-приложения:
C++
1
2
3
4
5
6
7
8
9
class test{
public:
    string s;
    vector<int> v;
    int i;
    float f;
    test (string _s, int _v, int _i, float _f) {s = _s; v.push_back (_v); i = _i; f = _f;};
    ~test () {};
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
    HWND            hWnd;
    MSG          msg;
    WNDCLASSEX  wndclass;
 
    wndclass.cbSize       = sizeof(WNDCLASSEX);
    wndclass.style          = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc    = fnMessageProcessor;
    wndclass.cbClsExtra  = 0;
    wndclass.cbWndExtra  = 0;
    wndclass.hInstance    = hInstance;
    wndclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor         = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
    wndclass.lpszMenuName  = NULL;
    wndclass.lpszClassName = "Window Class";
    wndclass.hIconSm         = LoadIcon(NULL, IDI_APPLICATION);
 
    if(RegisterClassEx(&wndclass) == 0)  {
         exit(1);
    }
 
    hWnd = CreateWindowEx(
        WS_EX_OVERLAPPEDWINDOW,
        "Window Class", "Test",
        WS_OVERLAPPEDWINDOW,
        0, 0, 100, 100,
        NULL, NULL, hInstance,NULL);
 
    ShowWindow(hWnd, iCmdShow);
 
    string f = "f.dat";
    test a ("1", 2, 3, 4.0f);
    test b ("0", 0, 0, 0);
 
    ofstream out (f, ios::binary);
    out.write ((char *) &a, sizeof (test));
    out.close ();
 
    ifstream in (f, ios::binary);
    in.read ((char *) &b, sizeof (test));
    in.close ();
 
    ofstream log ("log.txt");
    log << b.s << " " << b.v[0] << " " << b.i << " " << b.f << endl;
    log.close ();
 
    while(GetMessage (&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (msg.wParam);
}
Добавлено через 2 часа 19 минут
Я так понимаю, что класс содержит не POD, поэтому выдаёт ошибку при разрушении векторов и стрингов. Но вопрос вот в чём: почему в консольном приложении всё работает.

PS: пробую boost/serialization/

Добавлено через 3 часа 10 минут
Проблему решило использование сериализации boost.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <windows.h>
#include <fstream>
#include <string>
#include <vector>
 
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/vector.hpp>
#include <boost/serialization/string.hpp>
 
using namespace std;
using namespace boost::archive;
using namespace boost::serialization;
 
class test{
    friend class access; //boost::serialization
public:
    string s;
    vector<int> v;
    int i;
    float f;
    test (string _s, int _v, int _i, float _f) {s = _s; v.push_back (_v); i = _i; f = _f;};
    ~test () {};
    template <class archive>
    void serialize (archive &ar, const unsigned int version) {
        ar & s;     ar & v;     ar & i;     ar & f;
    }
};
 
LRESULT CALLBACK fnMessageProcessor (HWND, UINT, WPARAM, LPARAM);
 
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
    HWND            hWnd;
    MSG          msg;
    WNDCLASSEX  wndclass;
 
    wndclass.cbSize       = sizeof(WNDCLASSEX);
    wndclass.style          = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc    = fnMessageProcessor;
    wndclass.cbClsExtra  = 0;
    wndclass.cbWndExtra  = 0;
    wndclass.hInstance    = hInstance;
    wndclass.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor         = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
    wndclass.lpszMenuName  = NULL;
    wndclass.lpszClassName = "Window Class";
    wndclass.hIconSm         = LoadIcon(NULL, IDI_APPLICATION);
 
    if(RegisterClassEx(&wndclass) == 0)  {
         exit(1);
    }
 
    hWnd = CreateWindowEx(
        WS_EX_OVERLAPPEDWINDOW,
        "Window Class", "Test",
        WS_OVERLAPPEDWINDOW,
        0, 0, 100, 100,
        NULL, NULL, hInstance,NULL);
 
    ShowWindow(hWnd, iCmdShow);
 
    string f = "f.dat";
    test a ("1", 2, 3, 4.0f);
    test b ("0", 0, 0, 0);
 
    ofstream out (f, ios::binary);
    binary_oarchive boa (out); //boost::archive
    boa << a;
    out.close ();
 
    ifstream in (f, ios::binary);
    binary_iarchive bia (in); //boost::archive
    bia >> b;
    in.close ();
 
    ofstream log ("log.txt");
    log << b.s << " " << b.v[0] << " " << b.i << " " << b.f << endl;
    log.close ();
 
        while(GetMessage (&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (msg.wParam);
}
 
LRESULT CALLBACK fnMessageProcessor (HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam){
    switch(iMsg){
        case WM_CREATE:
            return(0);
        case WM_PAINT:
            return(0);
        case WM_DESTROY:
            PostQuitMessage(0);
            return(0);
        default:
            return DefWindowProc(hWnd, iMsg, wParam, lParam);
    }
}
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.10.2014, 19:03
Ответы с готовыми решениями:

Access violation writing location 0x0000001C при возврате вектора из функции
При возврате вектора из этой функции выкидывает исключение Exception thrown at 0x00E78AC8 in test.exe: 0xC0000005: Access violation...

Ошибка при запуске программы: Access violation writing location 0x00000000
Нужно было написать программу, которая вычислит через сколько лет утроится население города, если каждый год население увеличивается на...

Access violation writing location
Вылетает эта ошибка. В чём может быть проблема? Программа выполняется выводит результат, а после вылетает исключение. #include...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.10.2014, 19:03
Помогаю со студенческими работами здесь

Access violation writing location
Добрый день! на строке ptr = ptr; бросает unhandeled exeption: Access violation writing location, не пойму почему, может уже туплю....

Access violation writing location
#include &lt;iostream&gt; using namespace std; template &lt; typename t &gt; void QuickSort( t array, int left,int right) { int i = left; ...

0xC0000005: Access violation writing location
Пытаюсь запустить стороннее приложение таким кодом: PROCESS_INFORMATION P_I; STARTUPINFO S_I; ZeroMemory(&amp;S_I, sizeof(S_I));...

Исключение access violation writing location
Написал код (C++ &amp;&amp; WinApi, Visual Studio 2015 Preview): wchar_t* GameText1 _itow(GetRandomNumber(), GameText1, 10); ...

Ошибка Access violation writing location
Структура и объявление массива: struct Particle { float X; float Y; float Dx; float Dy; float R; int SegCount; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru