[QT] Występowanie random'owego błędu segmentacji.
Ostatnio zmodyfikowano 2017-10-09 22:46
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). |
|
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!!! #include <iostream> using namespace std; int main() { int * tab = new int[ 100 ]; delete[] tab; tab = nullptr; tab[ 22 ] = 22; }
|
|
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. |
|
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 func() { vector < int > tablica( 100 ); string s = { "Alicja ma tygrysa" }; }
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 |
|
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 |
|
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ą. 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. |
|
1 « 2 » |