Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z new i delete(C++)

Ostatnio zmodyfikowano 2016-06-30 13:52
Autor Wiadomość
GrhuGhu
Temat założony przez niniejszego użytkownika
Problem z new i delete(C++)
» 2016-06-30 11:13:40
Witam. Jestem początkującym programistą i niedawno zacząłem bawić się wskaźnikami.

#include <iostream>

using namespace std;
C/C++
int ile;

int main()
{
    cin >> ile;
    int * wsk;
    wsk = new int[ ile ];
    for( int i = 0; i < ile; i++ )
    {
        cout <<( int ) wsk << endl;
        wsk++;
    }
   
    delete[] wsk;
   
    return 0;
}
.
Napisałem taki prosty kod, który miał przyjąć jakąś liczbę, a następnie utworzyć tablice o takiej "pojemności" po czym wyświetlić adres w pamięci każdej zmiennej z tej tablicy.
I tu się pojawia problem, bo gdy wprowadzę do programu jakąkolwiek liczbę (Z wyjątkiem 10 i 20, oraz taką, która mieściła by się w zmiennej typu int :P ) to program działa bez zarzutów, a kiedy zostanie wprowadzona liczba 10 lub 20, program utworzy te zmienne, wyświetli ich adres po czym wyskoczy komunikat informujący o tym, że owy program przestał działać. Ktoś wie czym to jest spowodowane lub co robię źle?
P-149524
darko202
» 2016-06-30 12:02:26
0.
  dziwne rzeczy opisujesz :-),
pewnie to niezdefiniowane zachowanie po tym co robisz.
 
1.
musisz jeszcze raz zastanowić się co robisz !

C/C++
wsk = new int[ ile ]; // tu
...
wsk++; //i tu
...

na co wskazuje "wsk" po wyjściu z pętli
czy jest to początek tablicy ? 
tzn. to co było w
wsk = new ....

czy jesteś już poza tablicą ?
zwalniasz wówczas co ?

2.
* utwórz nowy wskaźnik   
* przypisz mu wartość początkowa tablicy
* zastosuj na nim ++

zapamiętaj dlaczego tak :-)

P-149525
mateczek
» 2016-06-30 12:23:25
albo
C/C++
for( int i = 0; i < ile; i++ )
{
    cout <<( int ) wsk << endl;
    wsk[ i ];
}
P-149526
michal11
» 2016-06-30 12:29:37
@up

twój kod wypisze ile-razy pierwszy element tablicy.
P-149527
Monika90
» 2016-06-30 12:32:06
C/C++
cout <<( int ) wsk << endl;
To też jest źle, jeżeli już to tak:
C/C++
cout << reinterpret_cast < std::uintptr_t >( wsk ) << endl;

tylko trzeba dodać #include <cstdint>

P-149528
GrhuGhu
Temat założony przez niniejszego użytkownika
» 2016-06-30 12:39:54
C/C++
#include <iostream>

using namespace std;

int ile;

int main()
{
    cin >> ile;
    int * wsk;
    wsk = new int[ ile ];
    for( int i = 0; i < ile; i++ )
    {
        cout <<( int ) wsk << endl;
        wsk++;
    }
   
    wsk -= ile;
   
    delete[] wsk;
   
    return 0;
}

Teraz dobrze? :)
Jestem jeszcze początkujący, dziś dopiero zacząłem przerabiać wskaźniki, wciąż nie do końca rozumiem jak działają jednak powoli zaczynam łapać. Oglądam video kursy do c++ i kod prezentowany na filmie był dokładnie taki sam jak mój, dodatkowo działał bezbłędnie, początkowo jedyne rozwiązanie jakie udało mi się wymyślić to umieszczenie "i<=ile" zamiast "i<ile" w warunku pętli, mimo iż program nie wysypywał się to działał błędnie, bo wyświetlany był o jeden więcej adres niż został o to "poproszony". Po pewnym czasie zacząłem dochodzić do wniosku, że może nalezy wprowadzić linijkę "wsk -= ile;". W każdym razie dziękuje za pomoc. :)
P-149529
Monika90
» 2016-06-30 13:08:59
To też nie jest dobrze. Po prostu nie zmieniaj wartości wskaźnika wsk, to nie będziesz musiał go potem korygować. To jest niepotrzebna komplikacja, i łatwo popełnić błąd.


Oglądam video kursy do c++ i kod prezentowany na filmie był dokładnie taki sam jak mój, dodatkowo działał bezbłędnie
Zelent miał szczęście i jego błędny kod przez przypadek działał zgodnie z jego błędnymi wyobrażeniami na temat C++.
P-149530
GrhuGhu
Temat założony przez niniejszego użytkownika
» 2016-06-30 13:27:22
C/C++
cout << reinterpret_cast < std::uintptr_t >( wsk ) << endl;
Próbowałem dodać ową linijkę (A raczej podmienić "cout << (int)wsk << endl;) niestety kompilator pokazuje jakiś błąd. (Z góry uprzedzam, że dodałem biblioteke <cstdint>).

A co do wskaźnika, to czy skorygowanie go w ten sposób sprawi, że wróci on na swoje miejsce? (Lub przynajmniej o tyle miejsc ile wskazuje zmienna "ile") Jestem tylko ciekaw :)
P-149531
« 1 » 2
  Strona 1 z 2 Następna strona