• 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

0 głosów
53 wizyt
pytanie zadane 4 dni temu w C i C++ przez enigmatycznyclay Bywalec (2,400 p.)
zamknięte 4 dni temu 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ź 4 dni temu przez adrian17 Ekspert (203,080 p.)
edycja 4 dni temu 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 4 dni temu przez enigmatycznyclay Bywalec (2,400 p.)
Brzmi logicznie. Najciekawsze jest natomiast dlaczego w CodeBlocksie to działa.
komentarz 4 dni temu przez adrian17 Ekspert (203,080 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 4 dni temu przez enigmatycznyclay Bywalec (2,400 p.)
okej dziękuję
–1 głos
odpowiedź 4 dni temu przez Bondrusiek Maniak (53,070 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 4 dni temu przez enigmatycznyclay Bywalec (2,400 p.)
Niestety dalej. "Program przestał działać". Czego może to być wina w takim razie?
komentarz 4 dni temu przez enigmatycznyclay Bywalec (2,400 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 217 wizyt
pytanie zadane 11 stycznia 2018 w C i C++ przez migrad Nowicjusz (170 p.)
0 głosów
1 odpowiedź 90 wizyt
pytanie zadane 24 kwietnia 2018 w C i C++ przez Dudman Nowicjusz (180 p.)
+1 głos
2 odpowiedzi 72 wizyt
pytanie zadane 1 grudnia 2018 w C i C++ przez MAXIM7 Obywatel (1,690 p.)
Porady nie od parady
Zadając pytanie postaraj się o szczegółowe opisanie problemu oraz udostępnienie wszystkich istotnych informacji (kody źródłowe, zrzuty ekranu itp.).Opisanie problemu

66,984 zapytań

113,890 odpowiedzi

241,331 komentarzy

46,940 pasjonatów

Przeglądających: 231
Pasjonatów: 11 Gości: 220

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...