Odmienne działanie programu na Windowsie i Linuxie.

0

Ostatnio przez przypadek zainicjowałem zmienną w destruktorze, zamiast w konstruktorze. Czy mógłby mi ktoś wytłumaczyć, dlaczego program skompilowany na Windowsie x64 w Visual Studio wyświetlał prawidłową wartość (czy to przypadek, że tak jakby inicjował value wartością 0), a program skompilowany na linuxie g++ wskazywał wartości jakieś randomowe?

class MyClass {
	int value;
public:
	MyClass() {};
	~MyClass() {value = 0;}
	void show() {std::cout << ++value;}
	};
	
2

UB to UB, nie ma na to reguły. Może akurat kompilowałeś w trybie debug, a może wcześniej w pamięci było tam coś co zostawiło zera.

0

Robię właśnie testy. I dla takiej klasy:

class MyClass {
	int v1;
	float v2;
	size_t v3;
	std::string v4;
public:
	MyClass() {};
	~MyClass() {};
	int v5;
	float v6;
	size_t v7;
	std::string v8;

};

większość zmiennych ma wartość 0. Tylko v5 z niewiadomych przyczyn ma wartość 2.

1

Jak masz zachowanie niezdefiniowane, to odpowiedź możesz wybrać spośród:

  1. Bo tak.
  2. Bo "mók"

Wystarczy się zastanowić się przez chwilę co jest lepsze? Czy aby wartość była w pamięci zwolnionej czy aby pamięć zwolniona była ... zwolniona? A może lepiej by bezwarunkowo aplikacja się wywracała? Ja optuję za tym ostatnim na etapie tworzenia. Dlatego proponuję zainteresować się opcjami kompilatora -fsanitize* (dla gcc/clang).

1 użytkowników online, w tym zalogowanych: 0, gości: 1