• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Program crashuje na wyjściu

Object Storage Arubacloud
0 głosów
176 wizyt
pytanie zadane 9 października 2019 w C i C++ przez enigmatycznyclay Bywalec (2,450 p.)
zamknięte 9 października 2019 przez enigmatycznyclay

Witam. Testuję sobie zapis i odczyt binarny, plikowy w C++. Mam taki oto kod, który wykonuje się w całości ale z jakiegoś powodu crashuje już po wykonaniu wszystkich instrukcji. Chyba coś przeoczyłem. Z góry dziękuję za pomoc.

#include <iostream>
#include <fstream>


struct Player
{
	std::string name;
	int number;
	int score;
};

int main()
{
	Player zawodnik{ "imie", 13, 26 };

	std::ofstream fout("file.txt", std::ios_base::out | std::ios_base::binary);
	fout.write((char*)& zawodnik , sizeof Player);
	fout.close();

	Player zawodnik2;

	std::ifstream fin("file.txt", std::ios_base::in | std::ios_base::binary);
	fin.read((char*)& zawodnik2, sizeof Player);
	fin.close();

	std::cout << zawodnik2.number + 3;

	return 0;
}

 

komentarz zamknięcia: rozwiązane

2 odpowiedzi

+1 głos
odpowiedź 9 października 2019 przez adrian17 Ekspert (344,860 p.)
edycja 9 października 2019 przez adrian17
 
Najlepsza

Bo taka próba pisania do pliku nie zadziała i nie ma prawa działać.

Dla formalności, raport AddressSanitizera mówiący czemu się wysypuje:

16:00 $ g++ -g -fsanitize=address -std=c++11 main.cpp && ./a.out 
=================================================================
==32105==ERROR: AddressSanitizer: attempting free on address which was not malloc()-ed: 0x7ffe77c63570 in thread T0
    #0 0x7f6daae0fb2a in operator delete(void*) (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x99b2a)
    #1 0x40160f in Player::~Player() /home/adrian17/test/main.cpp:5
    #2 0x401434 in main /home/adrian17/test/main.cpp:20
    #3 0x7f6daa3d182f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
    #4 0x401128 in _start (/home/adrian17/test/a.out+0x401128)

std::string w samej strukturze ma tylko wskaźniki i liczby z rozmiarami. Więc "przepisując" tą strukturę, przepisujesz wartości wskaźników - teraz masz dwa std::stringi ze wskaźnikami na ten sam bufor, co kompletnie się wysypie gdy oba w destruktorze spróbują zwolnić tą samą pamięć.

komentarz 9 października 2019 przez enigmatycznyclay Bywalec (2,450 p.)
Brzmi logicznie. Najciekawsze jest natomiast dlaczego w CodeBlocksie to działa.
komentarz 9 października 2019 przez adrian17 Ekspert (344,860 p.)
Undefined behavior - być może GCC na windowsie generuje akurat taki kod, że nie są rzucane żadne widoczne błędy; co nie zmienia faktu, że kod jest błędny i może się zachować w zasadzie jakkolwiek.
komentarz 9 października 2019 przez enigmatycznyclay Bywalec (2,450 p.)
okej dziękuję
–1 głos
odpowiedź 9 października 2019 przez Bondrusiek Maniak (61,370 p.)

Witam,

dziwne u mnie program działa prawidłowo MinGW 5.3.0. Dodaj do sizeof nawiasy bez nich program nie skompilował się

sizeof(Player)

 

komentarz 9 października 2019 przez enigmatycznyclay Bywalec (2,450 p.)
Niestety dalej. "Program przestał działać". Czego może to być wina w takim razie?
komentarz 9 października 2019 przez enigmatycznyclay Bywalec (2,450 p.)
Właśnie sprawdziłem w CodeBlocksie i działa. Natomiast błąd pojawia się w visual studio. Ciekawe.

Podobne pytania

0 głosów
2 odpowiedzi 497 wizyt
pytanie zadane 11 stycznia 2018 w C i C++ przez migrad Nowicjusz (170 p.)
0 głosów
1 odpowiedź 276 wizyt
pytanie zadane 24 kwietnia 2018 w C i C++ przez Dudman Nowicjusz (180 p.)
0 głosów
1 odpowiedź 149 wizyt
pytanie zadane 26 stycznia 2020 w C i C++ przez Konrad Gałach Użytkownik (880 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...