-
1. Data: 2017-08-14 01:17:26
Temat: Automatic Reference Counting
Od: Borneq <b...@a...hidden.pl>
Języki Objective-C i Swift polegają na zliczaniu referencji. Jakie są
sposoby radzenia sobie z pętlami?
-
2. Data: 2017-08-14 01:35:20
Temat: Re: Automatic Reference Counting
Od: "M.M." <m...@g...com>
On Monday, August 14, 2017 at 1:17:27 AM UTC+2, Borneq wrote:
> Języki Objective-C i Swift polegają na zliczaniu referencji. Jakie są
> sposoby radzenia sobie z pętlami?
Nie znam konkretnie tego zagadnienia, ale w ogóle kojarzy mi się z
teorią grafów, coś w stylu: oznacz wierzchołek jako odwiedzony.
Pozdrawiam
P.S.
Rozumiem, że chodzi o X wskazuje na Y, a Y wskazuje na Z.
-
3. Data: 2017-08-14 02:40:04
Temat: Re: Automatic Reference Counting
Od: Borneq <b...@a...hidden.pl>
W dniu 14.08.2017 o 01:35, M.M. pisze:
> On Monday, August 14, 2017 at 1:17:27 AM UTC+2, Borneq wrote:
>> Języki Objective-C i Swift polegają na zliczaniu referencji. Jakie są
>> sposoby radzenia sobie z pętlami?
>
> Nie znam konkretnie tego zagadnienia, ale w ogóle kojarzy mi się z
> teorią grafów, coś w stylu: oznacz wierzchołek jako odwiedzony.
Co takiego jak weak_ptr które są również w C++.
Jak zrobione są shared_ptr i weak_ptr w C++?
Czy shared_ptr to obiekt a nie wskaźnik na obiekt, który ma pole
- goły wskaźnik
- wskaźnik na blok kontrolny - tutaj dodatkowy malloc?
Blok kontrolny to licznik referencji.
To jeszcze proste ale jak jest z weak:
Blok kontrolny to licznik referencji + drugi licznik.
Jak debugowałem shared_ptr to ma on w bloku kontrolnym _Uses i _Weaks -
po to by łatwiej było go konwertować na weak?
Bo konwersja jest konieczna. Czy shared ma oba liczniki, tylko jednego
nie wykorzystuje?
Jakie reguły zwalniania weak?
Tu jest przykład:
https://www.codeproject.com/Articles/541067/Cplusplu
s-Smart-Pointers
ale chciałem się dowiedzieć więcej
-
4. Data: 2017-08-14 10:03:31
Temat: Re: Automatic Reference Counting
Od: "M.M." <m...@g...com>
On Monday, August 14, 2017 at 2:40:04 AM UTC+2, Borneq wrote:
> W dniu 14.08.2017 o 01:35, M.M. pisze:
> > On Monday, August 14, 2017 at 1:17:27 AM UTC+2, Borneq wrote:
> >> Języki Objective-C i Swift polegają na zliczaniu referencji. Jakie są
> >> sposoby radzenia sobie z pętlami?
> >
> > Nie znam konkretnie tego zagadnienia, ale w ogóle kojarzy mi się z
> > teorią grafów, coś w stylu: oznacz wierzchołek jako odwiedzony.
>
> Co takiego jak weak_ptr które są również w C++.
> Jak zrobione są shared_ptr i weak_ptr w C++?
> Czy shared_ptr to obiekt a nie wskaźnik na obiekt, który ma pole
> - goły wskaźnik
> - wskaźnik na blok kontrolny - tutaj dodatkowy malloc?
> Blok kontrolny to licznik referencji.
> To jeszcze proste ale jak jest z weak:
> Blok kontrolny to licznik referencji + drugi licznik.
> Jak debugowałem shared_ptr to ma on w bloku kontrolnym _Uses i _Weaks -
> po to by łatwiej było go konwertować na weak?
> Bo konwersja jest konieczna. Czy shared ma oba liczniki, tylko jednego
> nie wykorzystuje?
> Jakie reguły zwalniania weak?
> Tu jest przykład:
> https://www.codeproject.com/Articles/541067/Cplusplu
s-Smart-Pointers
> ale chciałem się dowiedzieć więcej
Ja mam inne pytanie, czy warto tego używać i dlaczego?
Pozdrawiam
-
5. Data: 2017-08-14 10:14:59
Temat: Re: Automatic Reference Counting
Od: Borneq <b...@a...hidden.pl>
W dniu 14.08.2017 o 10:03, M.M. pisze:
> Ja mam inne pytanie, czy warto tego używać i dlaczego?
Warto, kompilator się sam martwi o zwolnienie pamięci. Pytanie - jak to
jest od środka robione.
-
6. Data: 2017-08-14 10:31:45
Temat: Re: Automatic Reference Counting
Od: "M.M." <m...@g...com>
On Monday, August 14, 2017 at 10:14:58 AM UTC+2, Borneq wrote:
> W dniu 14.08.2017 o 10:03, M.M. pisze:
> > Ja mam inne pytanie, czy warto tego używać i dlaczego?
>
> Warto, kompilator się sam martwi o zwolnienie pamięci. Pytanie - jak to
> jest od środka robione.
Widzę że coś jak QMutexLocekr w Qt, tylko że mutex locker samo
odblokowuje mutex a nie zwalnia pamięć :)
http://doc.qt.io/qt-4.8/qmutexlocker.html
Bardzo rzadko używam malloc i new. Gdy muszę parę linijek wpisać aby
zwolnić pamięć, to korona z głowy mi nie spadnie. Procedury staram się
pisać w ten sposób, aby był jeden punkt wyjścia, więc wszelkie
zwalnianie zasobów łatwiej ogarnąć, bo są zamieszczone zbiorczo na
końcu.
Jak to jest robione od środka... nie znam pełnej funkcjonalności,
trudno powiedzieć. Na pewno w destruktorze zwalnia pamięć - ale
myślę że to wiesz. Więc co pytasz? Dlaczego pytasz?
Jeśli w pierwszy poście pętlami nazwałeś cykle w grafie, to rozwiązuje
się to przez oznaczenie wierzchołka grafu jako oznaczony - tak jak
pisałem, ale nie odpowiedziałeś czy o to chodziło, czy zrozumiałeś, itd.
Pozdrawiam
-
7. Data: 2017-08-14 15:10:41
Temat: Re: Automatic Reference Counting
Od: Borneq <b...@a...hidden.pl>
W dniu 14.08.2017 o 10:31, M.M. pisze:
> Widzę że coś jak QMutexLocekr w Qt, tylko że mutex locker samo
> odblokowuje mutex a nie zwalnia pamięć :)
> http://doc.qt.io/qt-4.8/qmutexlocker.html
W poniższym przykładzie listy cyklicznej jest coś źle.
Shared nie powinien zwalniać, a zwalnia wszystkie z wyjątkiem jednego i
to przed opuszczeniem test(),
zamiana na weak skutkuje tym że jest na zmianę tworzenie i zaraz
zwalnianie. Coś nie tak, jak w teorii.
#include <memory>
#include <iostream>
using namespace std;
class Node
{
private:
int n;
public:
Node(int n): n(n)
{
cout << "Constructor Node is called " << n <<endl;
}
~Node()
{
cout << "Destructor Node is called " << n << endl;
}
shared_ptr<Node> prev;
};
int test()
{
shared_ptr<Node> node = shared_ptr<Node>(new Node(0));
shared_ptr<Node> first = node;
for (int i = 1; i < 5; i++)
{
shared_ptr<Node> prev = node;
node = shared_ptr<Node>(new Node(i));
node->prev = prev;
}
node->prev = node;
printf("====\n");
return 0;
}
int main()
{
test();
return 0;
}
-
8. Data: 2017-08-14 15:17:14
Temat: Re: Automatic Reference Counting
Od: Borneq <b...@a...hidden.pl>
W dniu 14.08.2017 o 15:10, Borneq pisze:
> shared_ptr<Node> first = node;
> node->prev = node; <---error
zaraz zaraz, powinno być first->prev = node;nawet zmienna jest first
teraz nie zwalnia wcale i jest ok.
-
9. Data: 2017-08-14 15:26:58
Temat: Re: Automatic Reference Counting
Od: Borneq <b...@a...hidden.pl>
W dniu 14.08.2017 o 15:10, Borneq pisze:
> shared_ptr<Node> prev;
zamiana na weak_ptr<Node> prev;
skutkuje:
Constructor Node is called 0
Constructor Node is called 1
Constructor Node is called 2
Destructor Node is called 1
Constructor Node is called 3
Destructor Node is called 2
Constructor Node is called 4
Destructor Node is called 3
====
Destructor Node is called 0
Destructor Node is called 4
Żle bo wszystkie destructory powinny być wołane po kresce, za szybko
teraz zwalnia.
---
shared_ptr<Node> prev;
weak_ptr<Node> weakprev;
first->weakprev = node;
Teraz ok, czyli najgłębszy wskazujący ten na szczycie powinien być tylko
weak.
-
10. Data: 2017-08-14 15:36:19
Temat: Re: Automatic Reference Counting
Od: "M.M." <m...@g...com>
On Monday, August 14, 2017 at 3:10:41 PM UTC+2, Borneq wrote:
> W dniu 14.08.2017 o 10:31, M.M. pisze:
> > Widzę że coś jak QMutexLocekr w Qt, tylko że mutex locker samo
> > odblokowuje mutex a nie zwalnia pamięć :)
> > http://doc.qt.io/qt-4.8/qmutexlocker.html
>
> W poniższym przykładzie listy cyklicznej jest coś źle.
> Shared nie powinien zwalniać, a zwalnia wszystkie z wyjątkiem jednego i
> to przed opuszczeniem test(),
> zamiana na weak skutkuje tym że jest na zmianę tworzenie i zaraz
> zwalnianie. Coś nie tak, jak w teorii.
>
> #include <memory>
> #include <iostream>
> using namespace std;
>
> class Node
> {
> private:
> int n;
> public:
> Node(int n): n(n)
> {
> cout << "Constructor Node is called " << n <<endl;
> }
> ~Node()
> {
> cout << "Destructor Node is called " << n << endl;
> }
> shared_ptr<Node> prev;
> };
>
>
>
> int test()
> {
> shared_ptr<Node> node = shared_ptr<Node>(new Node(0));
> shared_ptr<Node> first = node;
> for (int i = 1; i < 5; i++)
> {
> shared_ptr<Node> prev = node;
> node = shared_ptr<Node>(new Node(i));
> node->prev = prev;
> }
> node->prev = node;
Dopiero teraz nie mam wątpliwości, co nazywałeś pętlą w
pierwszym wątku :)
> printf("====\n");
> return 0;
> }
>
> int main()
> {
> test();
> return 0;
> }