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

[QT] Występowanie random'owego błędu segmentacji.

Ostatnio zmodyfikowano 2017-10-09 22:46
Autor Wiadomość
YooSy
» 2017-10-09 12:40:34
Jednak wyjście poza tablicę.
Deklarując tablicę char* na jeden element, możesz w nim trzymać jedynie '\0'.
Wpisując jakikolwiek inny znak, odczytany będzie łańcuch znaków, póki nie zostanie osiągnięty
gdzieś tam znak zerowy ( w nieswojej pamięci).
P-165572
mateczek
» 2017-10-09 12:42:18
samo delete na wskaźniku zerowym nie powinno. Ale taki styl pisania to proszenie się o problemy.

delete może i nic nie zrobi ale pisanie do zerowego wskaźnika już tak!!!
C/C++
#include <iostream>
using namespace std;
int main() {
    int * tab = new int[ 100 ];
    delete[] tab;
    tab = nullptr;
    tab[ 22 ] = 22;
}
P-165573
dlakin95
Temat założony przez niniejszego użytkownika
» 2017-10-09 12:55:14
Dobra. Dzięki za pomoc. Właśnie prowadzę refaktoryzację. Z wskaźników lubię korzystać, bo mogę lepiej zarządzać pamięcią, ale nie wiedziałem, że tworząc char* tworzę tablicę znaków, czyli stringa.
P-165574
mateczek
» 2017-10-09 13:06:40
bo mogę lepiej zarządzać pamięcią
Ale nie ma co być poprawiać twórców biblioteki. To naprawdę mądre chłopaki. I jeśli piszesz
C/C++
func() {
    vector < int > tablica( 100 ); // tu sobie za alokuje pamięć na stercie
    string s = { "Alicja ma tygrysa" }; // tu też sobie za alokuje pamięć na stercie
    //[....]
   
} // a tu sobie zwolnii!!!!
I początkujący programista na pewno nie zrobi tego lepiej !!!

że tworząc char* tworzę tablicę znaków, czyli stringa.
Bo nie tworzysz tablicy tylko alokujesz przestrzeń na jeden znak. Ale potem masz niepotrzebny problem z ogarnięciem tego. Już pomijam fakt, że sam wskaźnik może zajmować więcej pamięci niż znak, a procedura alokacji pamięci to niepotrzebny narzut
P-165575
dlakin95
Temat założony przez niniejszego użytkownika
» 2017-10-09 22:29:57
Ogólnie przepisałem kod, jednak program działa jak działał, ale sukcesem jest to, że znalazłem źródło problemu. Jest nią funkcja, którą wysłałem. Spróbuję ją sprawdzić i program powinien zacząć żyć na nowo. Ogólnie dzięki za porady. Postaram się do nich stosować. Jak naprawię ten problem, zostanie mi tylko stworzenie głównej funkcji programu, dodatkowych funkcjonalności oraz grafiki. :D
P-165593
dlakin95
Temat założony przez niniejszego użytkownika
» 2017-10-09 22:46:16
Problem znaleziony.

To co zakomentowane to cześć starego zapisu. Wyobraźcie sobie co się działo z pamięcią.

C/C++
void ConfigDataPosition::addNewProjectPos( unsigned long long newPos ) {
    if(( parent->getNumbOfProjects() + 1 ) % 20 == 0 ||( parent->getNumbOfProjects() + 1 ) == 1 ) {
        if( projectsPosition != nullptr ) { /* } */ <----------------------------------------------------
            uint numbOfProjectsPos =( parent->getNumbOfProjects() + 1 ) * 0.05 + 1;
            unsigned long long * temp = new unsigned long long[ numbOfProjectsPos ];
            * temp = newPos;
            for( uint i = 1; i < numbOfProjectsPos; i++ )
                 *( temp + i ) = *( projectsPosition + i - 1 );
           
            delete[] projectsPosition;
            projectsPosition = temp;
        } else {
            projectsPosition = new unsigned long long[ 1 ];
            * projectsPosition = newPos;
        }
    }
}

Dzięki i pozdrawiam.
P-165595
1 « 2 »
Poprzednia strona Strona 2 z 2