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

Breakpoint wskaźniki

Object Storage Arubacloud
0 głosów
192 wizyt
pytanie zadane 19 kwietnia 2020 w C i C++ przez Chaki0981 Nowicjusz (120 p.)

Cześć

Męczę się z takowym problemem, że wywala mi breakpoint w momencie zwalniania pamięci z tablicy dynamicznej i nie moge się go pozbyć. Kombinowałem z wielkością tablicy(warunek w petli for) ale nie idzie. Ma ktoś jakiś pomysł o co chodzi? Bo kombinuje z tymi wskaźnikami i ta tym problemie sie zatrzymałem.

 

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>

using namespace std;

int main()
{
	fstream plik;
	plik.open("dane.txt", ios::in);

	if (!plik.good() == 1)
	{
		cout << "Nie znaleziono pliku!" << endl;
		exit(0);
	}
	
	string linia;
	int ile;
		
	cout << "Ile linijek z pliku chcesz odczytac: ";
	cin >> ile;

	int* tablica;
	tablica = new int[ile];

	for (int i = 0; i < ile; i++)
	{
		getline(plik, linia);
		*tablica = atoi(linia.c_str());
		cout << *tablica << endl;
		cout << (int)tablica << endl;
		if(i<4)tablica++;
		cout << (int)tablica << endl;
	}
	
	plik.close();
	delete[] tablica;

	return 0;
}

 


 

3 odpowiedzi

+1 głos
odpowiedź 19 kwietnia 2020 przez amelia.cpp Obywatel (1,860 p.)

 cout << (int)tablica << endl;

Nie możesz rzutować int* na int. 

komentarz 19 kwietnia 2020 przez Chaki0981 Nowicjusz (120 p.)
Nawet jak to usune to błąd się pojawia. Te linijki dodałem tylko żeby sprawdzić jak adresy się zmieniają.
komentarz 20 kwietnia 2020 przez j23 Mędrzec (195,220 p.)

@amelia.cpp, w sumie to może, choć w 64-bitach dostanie warninga, że rzutuje na mniejszy typ. Rzutowanie w stylu C wybacza znacznie więcej.

@Chaki0981, jak chcesz adresy podglądać, to wystarczy tak:

std::cout << tablica << '\n';

 

+1 głos
odpowiedź 19 kwietnia 2020 przez j23 Mędrzec (195,220 p.)
tablica = new int[ile];
...
 
    tablica++;
...

delete[] tablica;
 

To nie będzie działać. delete musi dostać dokładnie taki sam adres, jaki zwróciło new.

komentarz 20 kwietnia 2020 przez JAKUBW Nałogowiec (33,470 p.)

Dokładnie, pan Mirosław Zelent popełnił tu bardzo duży błąd. Samemu wykonałem test i polecam każdemu niewierzącemu wykonanie jego:

#include <iostream>

int main() {
    const unsigned long size = 1024L * 1024L * 1024L * 16L;

    std::cin.get();
    std::cout << "Allocation ";
    char *ptr = new char[size];
    std::cout << "Done\n";

    std::cin.get();
    std::cout << "Work ";
    for (unsigned long i = 0; i < size; ++i)
        ptr[i] = (char)i;
    std::cout << "Done\n";

    std::cin.get();
    std::cout << "deletion ";
    delete [] ptr;
    std::cout << "done\n";

    std::cin.get();
    return 0;
}

W tym przypadku co akcję mierzyłem użycie pamięci w moim komputerze. Wyniki były:

odpalenie programu:     2,3G
po alokacji:            2,3G
po użyciu:              18G
po usunięciu:           2,3G

Teraz wersja a'la MZ, czyli zmiana linijki

ptr[i] = (char)i;

na

*(ptr++) = (char)i;

 odpalenie programu:     2,3G
po alokacji:            2,3G
po użyciu:              18G

Jednak program przy usuwaniu się zcrashował z błędem:

free(): invalid size

 I zakończył 

Process finished with exit code 134 (interrupted by signal 6: SIGABRT)

 

0 głosów
odpowiedź 19 kwietnia 2020 przez LuQ232 Mądrala (7,200 p.)

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>

using namespace std;

int main()
{
    fstream plik;
    plik.open("dane.txt", ios::in);

    if (!plik.good() == 1)
    {
        cout << "Nie znaleziono pliku!" << endl;
        exit(0);
    }

    string linia;
    int ile;

    cout << "Ile linijek z pliku chcesz odczytac: ";
    cin >> ile;

    int* tablica;
    tablica = new int[ile];

    for (int i = 0; i < ile; i++)
    {
        getline(plik, linia);
        *tablica = atoi(linia.c_str());
        cout << *tablica << endl;
        tablica++;
    }
    plik.close();
    delete[] tablica;

    return 0;
}

 

komentarz 19 kwietnia 2020 przez Chaki0981 Nowicjusz (120 p.)
Ale tutaj usunąłeś zmiane adresu wskaźnika, a ją dodałem żeby zapisać kolejne liniki z pliku do kolejnej szufladki. Chyba że coś źle pojmuje w tych adresach?
komentarz 19 kwietnia 2020 przez LuQ232 Mądrala (7,200 p.)

Jeżeli chcesz zobaczyć adres wskaźnika wystarczy, że zrobisz: 

        cout << tablica << endl;

Zauważ, że zawsze po wczytaniu ja przesuwam wskaźnik na kolejny element  używając: 

tablica++;

To przesuwa wskaźnik na kolejny adres. Dzięki temu pierwsza linijka jest przypisana do tablica[0] ( PRZESUWAM WSKAŹNIK) następna jest przypisana do tablica[1]  ITD.

Podobne pytania

+2 głosów
0 odpowiedzi 357 wizyt
0 głosów
2 odpowiedzi 175 wizyt
pytanie zadane 15 stycznia 2017 w HTML i CSS przez Nicolaus Dyskutant (9,740 p.)
0 głosów
1 odpowiedź 160 wizyt
pytanie zadane 2 kwietnia 2022 w C i C++ przez Viltus Początkujący (300 p.)

92,752 zapytań

141,666 odpowiedzi

320,385 komentarzy

62,100 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

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!

...