• 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

VPS Starter Arubacloud
0 głosów
175 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,100 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,100 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 486 wizyt
pytanie zadane 11 stycznia 2018 w C i C++ przez migrad Nowicjusz (170 p.)
0 głosów
1 odpowiedź 271 wizyt
pytanie zadane 24 kwietnia 2018 w C i C++ przez Dudman Nowicjusz (180 p.)
0 głosów
1 odpowiedź 148 wizyt
pytanie zadane 26 stycznia 2020 w C i C++ przez Konrad Gałach Użytkownik (880 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...