Użycie delete (etap raczkowania)

0
        int wojna[2];
	int* point = new int{ wojna[0] };
	cout << "Wpisz liczbe: " << endl;
	cin >> wojna[0];
	cout << point << endl;
	delete point;
	cout << point << endl;
	cout << wojna[0];
    
       //////////////////////////////////////////////

        int wojna;
	int* point = new int{ wojna };
	cout << "Wpisz liczbe: " << endl;
	cin >> wojna;
	cout << point << endl;
	delete point;
	cout << point << endl;
	cout << wojna;

	//////////////////////////////////////////

	int forex;
	int * pi;
	pi = new int;
	pi = &forex;
	cout << "Wpisz: " << endl;
	cin >> forex;
	cout << forex << pi << *pi;

	delete pi;

Mam trzy problemy:

  1. W pierwszej połowie kodu program nadal wyświetla zawartość tablicy wojna, mimo że użyłem delete do kasowania bloku.

  2. Kiedy zmienię tablicę wojna na zmienną wojna(usunę klamry), kompilator również odmawia współpracy podając error C4700

  3. W niższej połowie kodu próbowałem rozłożyć proces new i delete na czynniki pierwsze, lecz kompilator zgłasza błąd, i podaje za przyczynę złe zastosowanie delete.**

Szczerze mówiąc dotychczas nie miałem problemu z rozumowaniem tego co dyktuje mi książka, dopiero przy wskaźnikach wszystko przestało działać.

Próbowałem szukać po innych postach ze słowem delete, ale kody były zbyt skomplikowane jak dla mnie.
Z góry dzięki za objaśnienie moich błędów.

1

Używasz niezainicjalizowanej tablicy. Undefined behavior. Program ma niezdefiniowane zachwanie. Może nawet gasić światło w pokoju.

  1. Bo prawdopodobnie wskaźnik nie został nigdzie przesunięty oraz pamięć nie została nadpisana, ale użycie zwolnionego to UB.

  2. Nie rozumiem o co chodzi. Pokaż przykład błędnego kodu.

2
    int * pi;
    pi = new int;
    pi = &forex;
    delete pi;

https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/ - ogólna powiązana lektura

Nadpisujesz wskaźnik adresem forex - zmiennej lokalnej. Na niej nie możesz użyć delete, a adres zaalokowanej pamięci już utraciłeś. Co tutaj w ogóle chcesz osiagnąć?

0
#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

struct human { string eyes; float weight; float growth; };

int main()
{
	wcout.imbue(std::locale("Polish_poland.852"));


	human example;
	human * ind = new human{ example }; // Źle przypisałem wskaźnik do zmiennej example?
	cout << "Kolor oczu: ";
	cin >> (ind->eyes);
	wcout << "Waga: ";
	cin >> (ind->weight);
	cout << "Wzrost: ";
	cin >> (ind->growth);

	cout << (ind->eyes) << endl << (ind->weight) << endl << (ind->growth) << endl;

	delete ind; // Zwalnia pamięc

	cout << example.eyes; // Nie wyświetla nic mimo tego że użytkownik wprowadził tam dane.

	cout << (ind->eyes); // Program się zawiesza. Czyli zwolniło pamięć.

	cout << endl << endl << endl << endl << endl;

	human john;
	human * ind2 = new human{ john }; // Źle przypisałem wskaźnik do zmiennej john?

	cout << "Kolor oczu: ";
	cin >> john.eyes;
	wcout << "Waga: ";
	cin >> john.weight;
	cout << "Wzrost: ";
	cin >> john.growth;

	cout << john.eyes << " " << john.weight << " " << john.growth << endl;

	delete ind2; // Zwalnia pamięc

	cout << john.eyes; // Nadal wyświetla zawartość john.eyes

	cin.get();
	cin.get();
    return 0;

// Chodzi mi głównie o to dlaczego wskaźnik nie jest przypisany do zmiennej? Dlaczego nie usuwa jej pamięci?
}

Wiem że ten program wygląda jak cyrk na kółkach.

0
human * ind = new human{ example }; // Źle przypisałem wskaźnik do zmiennej example?

Nie przypisałeś wskaźnika do zmiennej. Zaalokowałeś i utworzyłeś kopię i to do niej wskaźnik przypisałeś.

human* ind = &example;

Pozbądź się new i delete (link wyżej).

cout << example.eyes; // Nie wyświetla nic mimo tego że użytkownik wprowadził tam dane.

Absolutnie nie. Użytkownik wprowadził do zaalokowanej nowej zmiennej (teraz już zwolnionej). Jak robisz ksero kartki i zapiszesz coś na kopii, nie oczekuj że oryginał zostanie odpowiednio zmieniony.

0

Absolutnie nie. Użytkownik wprowadził do zaalokowanej nowej zmiennej (teraz już zwolnionej). Jak robisz ksero kartki i zapiszesz coś na kopii, nie oczekuj że oryginał zostanie odpowiednio zmieniony.

Więc w jaki sposób alokować nowy adres za pomocą new, na oryginał zmiennej? Tak żebym mógł zwolnić pamięć z oryginału. Rozumiem że po to jest new i delete aby czyścić zbędne dane, po czym wykorzystać puste miejsce. Albo nie rozumiem całej genezy tych dwóch obiektów, albo po prostu nie potrafię ustawić wskaźnika, alokowanego przez new, na oryginał zmiennej.

Z chęcią będę używał klasy vector i array. Chcę tylko względnie zrozumieć new i delete.

1

Jak masz zmienną, to nie potrzebujesz już nic do niej alokować!

Rozumiem że po to jest new i delete aby czyścić zbędne dane, po czym wykorzystać puste miejsce

Nie, jest od alokacji i dealokacji obiektów!

po prostu nie potrafię ustawić wskaźnika, alokowanego przez new, na oryginał zmiennej.

Bo tego się nie da zrobić! new1 alokuje nową (ang. new) zmienną!

1ok, poza placement, ale nie o to tu chodzi

3
   delete ind; // Zwalnia pamięc

   cout << example.eyes; // Nie wyświetla nic mimo tego że użytkownik wprowadził tam dane.

   cout << (ind->eyes); // Program się zawiesza. Czyli zwolniło pamięć.

Albo i nie. Niezdefiniowane zachowanie dotyczy całego przebiegu programu, włącznie z instrukcjami poprzedzającymi.
Program mógł się na przykład nie zawiesić. A gdyby twoje ind miało destruktor, mógłby się on na przykład nie wykonać. Mimo że delete było dwie linijki wyżej.

0

Już wszystko rozumiem. Po prostu źle zrozumiałem przeznaczenie new, myślałem że stosuje się je również do zmiennych zaalokowanych automatycznie. Ubzdurałem sobie coś źle interpretując wiedzę z książki,i nie mogłem tego wyrzucić z głowy.
Dzięki za cierpliwość. Można zamknąć.

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