Wpis z mikrobloga

#swift #programowanie

Hej Mireczki!

Mam dość nietypowy problem. Na zdjęciu znajduje się fragment kodu, który za pomocą aproksymacji interpolacyjnej określa wartości punktów pośrednich pewnej funkcji (w sumie to nieistotne). Chodzi o to, że kod ten działa, gdy kompiluję go w trybie Debug, niemniej jednak po skompilowaniu w trybie Release i uruchomieniu programu otrzymuję następujący komunikat (w około 70% przypadków, czasami działa), zatrzymuje się wykonywać na linii 78.:

MNP3(4498,0x1008b53c0) malloc: *** error for object 0x10200e600: incorrect checksum for freed object - object was probably modified after being freed.


Zastanawiacie się pewnie co w linii 76. robi ten print? Otóż ku mojemu zdziwieniu rozwiązuje on problem (no nie do końca, bo tak nie powinno być xd). Odkomentowanie go eliminuje wspomniany problem z pamięcią. Czy ktoś ma jakikolwiek pomysł, dlaczego tak jest (i co mogę na to poradzić)?
Pobierz
źródło: comment_EiMIp9BjBXC5VbB26FzaGYItUGh4nDsw.jpg
  • 25
@wczoraj: Projekt buduję od nowa (command+b). Breakpoint pokazał mi tutaj trochę asemblerka:

libsystemmalloc.dylib`mallocerror_break:
-> 0x7fffc193515f <+0>: pushq %rbp
0x7fffc1935160 <+1>: movq %rsp, %rbp
0x7fffc1935163 <+4>: nop
0x7fffc1935164 <+5>: nopl (%rax)
0x7fffc1935168 <+9>: popq %rbp
0x7fffc1935169 <+10>: retq

Zatrzymało się tam, gdzie jest strzałka.

Google niewiele pomaga, mówi tylko to, co już wynika z samego błędu (próba modyfikacji pamięci po jej zwolnieniu).
@wczoraj: Używając przycisku "Step out" dwa razy wracam znowu do linii 78.:

predictedPoints.append((predictedDistance, searchedHeight))


za pierwszym naciśnięciem jestem na czymś takim:

-> 0x7fffc1931e81 <+406>: leaq 0xbe88(%rip), %rdi ; "MallocErrorStop"
@wczoraj: @Donald_W: Dziękuję bardzo za takie zainteresowanie.

Tutaj znajduje się kod programu:
https://pastebin.com/QCPgHK73

Typ projektu to "Command Line Application", cel to macOS.

Program wymaga pliku z danymi, którego ścieżkę podajecie w linii 20.

Dane, na których program się wywala (raczej nie jest to zależne o tych konkretnych danych, no ale):
https://pastebin.com/i72a8vG0

Ważne, że problem przynajmniej u mnie powstaje tylko, gdy kompiluję w trybie Release.
@Mooops123: Rzuć okiem czy działa opcja z += zamiast append:

Tablica na start:

var predictedPoints: [Relation] = []
Dodawanie w forze:

let point = (predictedDistance, searchedHeight)
predictedPoints += [point]
// predictedPoints.append(point)

`

U mnie działa bez problemów z +=, a append sypie tym samym błędem co u Ciebie.
@Donald_W: U mnie również działa z +=, niemniej jednak tak zdecydowanie nie powinno być. Wiesz dlaczego tak się dzieje? Jest to choroba wieku dziecięcego Swifta? Bo szczerze mówiąc jak ja mam się obawiać używania takich elementarnych metod jak .append w Stringu, to to nie świadczy dobrze o Swifcie.