04.06.2016, 18:10, "charleyb123 ." <charleyb...@gmail.com>:
> I won't be active in this thread, because IMHO this is the stuff of legends:  
> We are about to usher in a new decade of flame wars for all of C++ with this 
> topic (and these wars are underway in other C++ communities outside Qt).
>
> However, I want to chime-in here for Qt, and then I'll not be active on this 
> thread (but I will lurk).
>
> C++ is a value-semantics stack-based language, where heap allocations demand 
> that the developer (and the system design) manage object lifecycle.  This is 
> different from reference-based languages like C# or Java that have garbage 
> collection.
>
> This means that in C++, the act of "Design", or even the act of "Software 
> Development" is:
>
> (1) Decide what objects exist (e.g., types-and-instances)
> (2) Decide who owns them (e.g., object-lifecycle)
>
> There is no (3).
>
> Yes, the following idiom is currently being marketed to the C++ community:
>
>   auto f = std::make_shared<Foo>(...);
>
> This is to free the developer from considering implications of (2).

I disagree, (2) is still present as the choice of make-function. It's up to you 
to decide if it will be Foo(...), std::make_shared<Foo>(...), 
std::make_unique<Foo>(...), or something else.

>  However, there are real-world consequences.
>
> This is a highly precarious design pattern at scale.  This is the new "goto". 
>  Without sufficient discipline within the design to explicitly manage 
> lifecycles, this is the equivalent of a "global" instance of unknown duration 
> and unknown mutation across threads, arbitrarily, without any controls.
>
> It is a very dangerous design decision.  Who else is accessing the object 
> behind your shared pointer?  Are they all properly participating in the link 
> count?  Is another thread modifying the object while you are reading?  Are 
> you sure?  How will you debug when you find out you were wrong?
>
> Qt's historic model is parent-ownership, and if no parent, then the developer 
> explicitly manages ownership with "QObject::deleteLater()".  There are other 
> patterns, and indeed within Qt, you are encouraged to use these mechanisms 
> within your higher-order patterns.  For example, you are free to put your 
> "custom-deleter" within your "std::shared_ptr<>" or "std::unique_ptr<>".
>
> However, injecting "std::shared_ptr<>" and "std::unique_ptr<>" ubiquitously 
> through an API and library will go down in history as one of the biggest 
> design mistakes in C++, precisely because attention to (2) above should be 
> more explicit within the system design.  IMHO, a C++ developer cannot be 
> forgiven inattention to that detail.
>
> If you want to scale, the C++ developer must do both (1) and (2).
>
> I concede that for small projects, scaling is not an issue.  Yet.
>
> --charley
>
> On Sat, Jun 4, 2016 at 7:14 AM, Nye <kshegu...@gmail.com> wrote:
>> Hello,
>> Since this is opinion based I will give my opinion without explicitly 
>> stating it's just a personal view on the subject on every line.
>>
>> On Sat, Jun 4, 2016 at 3:55 PM, Антон Жилин <antonyzhi...@gmail.com> wrote:
>>> A trend in modern C++ is AAA idiom.
>>
>> The newest and hottest fad, which I consider to be a complete and utter *rap.
>>
>>> The idea here is to *prohibit* new in user code, because ownership 
>>> semantics of raw pointer is undefined.
>>
>> That's a matter of some debate. I consider the ownership to be passed to the 
>> person invoking new, unless otherwise stated (e.g. in Qt's documentation the 
>> ownership transfer(s) are duly noted).
>>
>>> How can we apply these idioms to Qt?
>>
>> The question rather is: Should we?
>>
>>> Yes, if we add a couple of helper functions!
>>>
>>> 1. Non-widgets can usually be constructed on stack or using std::unique_ptr 
>>> -- Great
>>
>> Applies to widgets as well. A stack allocation is much faster and robust 
>> than new-ing needlessly. So if you don't need to keep binary compatibility 
>> (e.g. when you have widgets in an application, or not directly exposed from 
>> a library) I'd always opt for stack allocation. No need to have two heap 
>> allocations, when I can get only one (the d-ptr of the QObject).
>>
>>> 2. If we construct an object with a parent, we do something like this:
>>> auto pushButton = new QPushButton(..., parent);
>>> -- Not so great, we need to look at parent to know if we need to delete 
>>> pushButton
>>
>> There was recently a thread on this same mailing list dealing with similar 
>> issues. For most intents and purposes you can delete the child directly, if 
>> that's not possible the deletion can be scheduled through the event loop. I 
>> for one don't see any reason to complicate matters.
>>
>>> 3. Widgets without a parent are usually used with QSharedPointer
>>
>> "Usually"? Not in my experience. Widgets without a parent I just create in 
>> the stack if possible. If not, I either use QScopedPointer when I own them, 
>> or QPointer when ownership is transferred to Qt. I don't intend to share my 
>> widgets, much less pass them across threads, so I don't see any good reason 
>> why I would want to use a _shared_ pointer to keep reference to them
>>
>>> What do you think?
>>
>> Well that's pretty much what I think. You can agree or disagree, but I 
>> really don't see any reason to embark in writing AAA-style.
>>
>> Kind regards,
>> Konstantin.
> ,
>
> _______________________________________________
> Interest mailing list
> Interest@qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest


-- 
Regards,
Konstantin
_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to