Re[9]: Похоже, починил.
От: Sheridan Россия  
Дата: 21.12.18 09:22
Оценка:
Здравствуйте, night beast, Вы писали:

NB>>>скажи мне, кэп, откуда они узнают что ты у себя где-то обнулил этот указатель?

S>>Проверить на nullptr например?

NB>давай ты попробуешь изобразить это в коде?

if(ptr) { /*ptr жив, можно работать*/ }
Matrix has you...
Re[10]: Похоже, починил.
От: night beast СССР  
Дата: 21.12.18 09:27
Оценка: +3 :)
Здравствуйте, Sheridan, Вы писали:

NB>>>>скажи мне, кэп, откуда они узнают что ты у себя где-то обнулил этот указатель?

S>>>Проверить на nullptr например?

NB>>давай ты попробуешь изобразить это в коде?

S>
S>if(ptr) { /*ptr жив, можно работать*/ }
S>


struct shared_ptr
{
   int* ptr = nullptr;
};

int* raw_ptr = new int;
shared_ptr shared = { raw_ptr };

//...
delete raw_ptr;
raw_ptr = nullptr;

//...

if (shared.ptr) { /*shared.ptr жив, можно работать*/ }


так, да?
Re[4]: Похоже, починил.
От: AleksandrN Россия  
Дата: 21.12.18 10:54
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>В функцию что передаётся? raw ptr. Какой вывод? Управлять памятью этого объекта самостоятельно. Или нет? Какой уровень телепатии должен быть чтобы догадаться что там нужен "умный" указатель?


У них в документации есть интересная заметка.

Raw pointers are used whenever possible in the classes' public API. This simplifies exposing functions & classes to script, and is relatively safe, because SharedPtr & WeakPtr use intrusive reference counting.

https://urho3d.github.io/documentation/1.4/_conventions.html


Из этого прямо не следует, что для управления памятью, выделенной под указатели везде умные указатели используются, но это повод подробнее посмотреть документацию и примеры.
Re[6]: Похоже, починил.
От: B0FEE664  
Дата: 21.12.18 11:07
Оценка: +1 :)
Здравствуйте, Sheridan, Вы писали:


S>>>А урхопрограммеры даже не удосужились проверять на nullptr.

R>>А как они могут проверить, что ты обнулил где-то там какой-то свой указатель?

somthing* ptr = new somthing;
...
somthing* rawptr = ptr;
...
delete ptr;
ptr = nullptr;
....
if(!rawptr) { /*оппа, указателя больше нет!*/ /* да неужели? */}
И каждый день — без права на ошибку...
Re[9]: Похоже, починил.
От: B0FEE664  
Дата: 21.12.18 11:13
Оценка: +1
Здравствуйте, night beast, Вы писали:

NB>то есть в документации показано, как правильно использовать их либу, но ты решил что знаешь лучше, как надо, и теперь жалуешься что что-то не работает?


Это плохой подход к разработке библиотеки. Если специально не оговорено, что при каких-то условиях не будет работать, то должно работать. Если же работает только по определённым сценариям, то значит авторы слишком много о себе думают.
И каждый день — без права на ошибку...
Re[5]: Похоже, починил.
От: B0FEE664  
Дата: 21.12.18 11:25
Оценка: +2
Здравствуйте, night beast, Вы писали:

S>>В функцию что передаётся? raw ptr. Какой вывод? Управлять памятью этого объекта самостоятельно. Или нет? Какой уровень телепатии должен быть чтобы догадаться что там нужен "умный" указатель?

NB>в функцию передается raw ptr, скорее всего, чтобы избежать лишних инкрементов/декрементов на ровном месте.

Хотите избежать лишних инкрементов/декрементов на ровном месте? Передавайте ссылку!
Это явная ошибка дизайна:
class Geometry
{
  ...
  Vector<SharedPtr<VertexBuffer> > vertexBuffers_;
  ...
};

bool Geometry::SetVertexBuffer(unsigned index, VertexBuffer* buffer)
{
    if (index >= vertexBuffers_.Size())
    {
        URHO3D_LOGERROR("Stream index out of bounds");
        return false;
    }

    vertexBuffers_[index] = buffer;
    return true;
}


Должно быть:

bool Geometry::SetVertexBuffer(unsigned index, const SharedPtr<VertexBuffer>& buffer)
{
    if (index >= vertexBuffers_.Size())
    {
        URHO3D_LOGERROR("Stream index out of bounds");
        return false;
    }

    vertexBuffers_[index] = buffer;
    return true;
}
И каждый день — без права на ошибку...
Re[6]: Похоже, починил.
От: night beast СССР  
Дата: 21.12.18 11:27
Оценка:
Здравствуйте, B0FEE664, Вы писали:

S>>>В функцию что передаётся? raw ptr. Какой вывод? Управлять памятью этого объекта самостоятельно. Или нет? Какой уровень телепатии должен быть чтобы догадаться что там нужен "умный" указатель?

NB>>в функцию передается raw ptr, скорее всего, чтобы избежать лишних инкрементов/декрементов на ровном месте.
BFE>
BFE>Хотите избежать лишних инкрементов/декрементов на ровном месте? Передавайте ссылку!
BFE>Это явная ошибка дизайна:

чуть выше уже написали обоснование этому решению.
Re[13]: Крашит в дебрях std при работе с ofstream
От: landerhigh Пират  
Дата: 21.12.18 11:51
Оценка:
Здравствуйте, Sheridan, Вы писали:

L>>Еще никто не добавил, что использование синглтонов в принципе дурной тон и на самом деле есть то самое "я что тут происходит, кому объект может понадобиться и когда он будет удаляццо"?

S>Нет. У меня синглтон как раз по делу.

www.blinnov.com
Re[7]: Похоже, починил.
От: Sheridan Россия  
Дата: 21.12.18 12:48
Оценка: :))
Здравствуйте, B0FEE664, Вы писали:

BFE>
BFE>somthing* ptr = new somthing;
BFE>...
BFE>somthing* rawptr = ptr;
BFE>...
BFE>delete ptr;
BFE>ptr = nullptr;
BFE>....
BFE>if(!rawptr) { /*оппа, указателя больше нет!*/ /* да неужели? */}
BFE>


У меня такого бреда не бывает.
Matrix has you...
Re[6]: Похоже, починил.
От: Sheridan Россия  
Дата: 21.12.18 12:56
Оценка: +1 :)
Здравствуйте, B0FEE664, Вы писали:

BFE>Хотите избежать лишних инкрементов/декрементов на ровном месте? Передавайте ссылку!

BFE>Это явная ошибка дизайна

Да тут тред не про это. Тут тред про "шеридан дурак"
Matrix has you...
Re[7]: Похоже, починил.
От: B0FEE664  
Дата: 21.12.18 13:14
Оценка:
Здравствуйте, night beast, Вы писали:

BFE>>Это явная ошибка дизайна:

NB>чуть выше уже написали обоснование этому решению.
Это не обоснование, а рассказ от любителей разбрасывать грабли о том, что где-то в их коде лежат грабли. Авторам ничего не мешает сгенерить отдельный API для своих скриптов (чем бы эти скрипты не были).
И каждый день — без права на ошибку...
Re[7]: Похоже, починил.
От: Слава  
Дата: 21.12.18 13:19
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Да тут тред не про это. Тут тред про "шеридан дурак"


Ну наконец-то.
Re[11]: Похоже, починил.
От: Igore Россия  
Дата: 21.12.18 13:27
Оценка:
Здравствуйте, night beast, Вы писали:

NB>так, да?

Ты в этой ветке уже кажется третий кто ему пытается таким образом объяснить , и у него похоже проблема с пониманием что такое указатель.

Sheridan при delete ptr; и ptr = nullptr; — обнуляется только переменая ptr, никакие другие указатели на туже память не обнуляются, указатель это переменая, она занимает память, а то о чём ты мечтаешь будет указатель на указатель, но мой тебе совет, не иди по этому пути, помню у меня был друг у которого доходило до ****ptr, этож застрелиться.
Re[11]: Похоже, починил.
От: B0FEE664  
Дата: 21.12.18 13:32
Оценка:
Здравствуйте, rg45, Вы писали:

R>И главное: зачем создавать сложности, когда все эти "но" разрешаются предельно просто:

отказом от исключений.

No C++ exceptions. Error return values (false / null pointer / dummy reference) are used instead.

https://urho3d.github.io/documentation/1.4/_conventions.html
И каждый день — без права на ошибку...
Re[12]: Похоже, починил.
От: B0FEE664  
Дата: 21.12.18 13:53
Оценка: :)
Здравствуйте, Igore, Вы писали:

I>Sheridan при delete ptr; и ptr = nullptr; — обнуляется только переменая ptr, никакие другие указатели на туже память не обнуляются, указатель это переменая, она занимает память, а то о чём ты мечтаешь будет указатель на указатель, но мой тебе совет, не иди по этому пути, помню у меня был друг у которого доходило до ****ptr, этож застрелиться.


Ой да ладно! Застрелился он...
Smart указатели на то и смарт, что могут всё:

struct mirror_ptr
{
   int*& ptr;
   mirror_ptr(int*& p) ptr(p){}
};

int* raw_ptr = new int;
shared_ptr<mirror_ptr> shared = make_shared<mirror_ptr<int>>(raw_ptr);

//...
delete raw_ptr;
raw_ptr = nullptr;

//...

if (shared->ptr) { /*raw_ptr жив, можно работать*/ }



https://ideone.com/JqTA2M
И каждый день — без права на ошибку...
Re[13]: Похоже, починил.
От: Igore Россия  
Дата: 21.12.18 14:20
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, Igore, Вы писали:


I>>Sheridan при delete ptr; и ptr = nullptr; — обнуляется только переменая ptr, никакие другие указатели на туже память не обнуляются, указатель это переменая, она занимает память, а то о чём ты мечтаешь будет указатель на указатель, но мой тебе совет, не иди по этому пути, помню у меня был друг у которого доходило до ****ptr, этож застрелиться.


BFE>Ой да ладно! Застрелился он...

BFE>Smart указатели на то и смарт, что могут всё:
Не не не, ты не понял, голые указатели с четвертым уровнем косвености, никаких умных указателей void**** m_someDataPtr;
Re[12]: Похоже, починил.
От: Privalov  
Дата: 21.12.18 15:11
Оценка:
Здравствуйте, Sheridan, Вы писали:

R>>1. Что ты будешь с этим исключением делать? Как ты определишь, какой из объектов кинул исключение? Они ведь неразличимы.

S>Значит перепишу так, чтобы были различимы, раз уж именно тут надо перехватить и именно в таких условиях.

Это предложение говорит мне о том, что тебе очень мало приходилось работать с чужим кодом. А я видел код, сделанный как раз "чтобы были различимы". Причем на гораздо менее злобной Java.
Ты подумай: а вдруг с этим твоим кодом начнет работать маньяк, который знает твой домашний адрес?
Re[5]: Похоже, починил.
От: PM  
Дата: 21.12.18 15:35
Оценка:
Здравствуйте, AleksandrN, Вы писали:

S>>В функцию что передаётся? raw ptr. Какой вывод? Управлять памятью этого объекта самостоятельно. Или нет? Какой уровень телепатии должен быть чтобы догадаться что там нужен "умный" указатель?


AN>У них в документации есть интересная заметка.

AN>

AN>Raw pointers are used whenever possible in the classes' public API. This simplifies exposing functions & classes to script, and is relatively safe, because SharedPtr & WeakPtr use intrusive reference counting.

AN>https://urho3d.github.io/documentation/1.4/_conventions.html


AN>Из этого прямо не следует, что для управления памятью, выделенной под указатели везде умные указатели используются, но это повод подробнее посмотреть документацию и примеры.


Там у них вдобавок вообще все плохо с многопоточностью, https://urho3d.github.io/documentation/1.5/_multithreading.html

When making your own work functions or threads, observe that the following things are unsafe and will result in undefined behavior and crashes, if done outside the main thread:


Смотрим в https://github.com/urho3d/Urho3D/blob/master/Source/Urho3D/Container/RefCounted.h#L52-L55 и видим
/// Reference count structure.
struct RefCount
{
    /// Reference count. If below zero, the object has been destroyed.
    int refs_;
    /// Weak reference count.
    int weakRefs_;
};


Не использовать atomic в самописном аналоге `std::shared_ptr` уже этих двух пунктов мне бы хватило чтобы отказаться от использования этой библиотеки.

Шеридан, берегись, у тебя вроде бы из разных потоков эта бибилотека используется.
Re[13]: Похоже, починил.
От: ViTech  
Дата: 21.12.18 15:44
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Ой да ладно! Застрелился он...

BFE>Smart указатели на то и смарт, что могут всё:

BFE>
BFE>struct mirror_ptr
BFE>{
BFE>   int*& ptr;
BFE>   mirror_ptr(int*& p) ptr(p){}
BFE>};

BFE>int* raw_ptr = new int;
BFE>shared_ptr<mirror_ptr> shared = make_shared<mirror_ptr<int>>(raw_ptr);

BFE>//...
BFE>delete raw_ptr;
BFE>raw_ptr = nullptr;

BFE>//...

BFE>if (shared->ptr) { /*raw_ptr жив, можно работать*/ }
BFE>



BFE>https://ideone.com/JqTA2M


Терзают меня смутные сомнения, что такой mirror_ptr может на что-нибудь полезное сгодиться. И долго хранить в куче ссылку на указатель (да и вообще на что либо) я бы поостерёгся.
Пока сам не сделаешь...
Re[7]: Похоже, починил.
От: rg45 СССР  
Дата: 21.12.18 15:45
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Да тут тред не про это. Тут тред про "шеридан дурак"


Тред создал ты, если ты уже забыл. "Помогите, мои идеальные программы крешатся".
--
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.