|
I know if I have a class like that
class A
{
shared_ptr<SomeType> data;
}
I don't need to declare a destructor, as the compiler will automatically write one for me that take care of everything.
But what if I have a resource without a destructor, such as a handle.
I need to implement a destructor
class A
{
shared_ptr<SomeType> data;
HANDLE wndobj;
~A() {
CloseHandle(wndobj);
}
}
Do I need to handle all variable? or only those without destructor (i.e. wndobj)?
I.e. what of data?
A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station....
_________________________________________________________
My programs never have bugs, they just develop random features.
|
|
|
|
|
Good question, if your class allocated the pointer, but shared it with other classes, then you will need to reference count it and olny delete the allocation when the last reference is removed.
==============================
Nothing to say.
|
|
|
|
|
it's a shared_ptr! the reset method is here for that, it decrease ref count.
so, if I get you right, when I declare my own explicit destructor I do need to call all the destructor of my properties? but I didn't use new... (as in ComPtr<t> that I get through a query) mmm .. I guess I set those to null..
A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station....
_________________________________________________________
My programs never have bugs, they just develop random features.
|
|
|
|
|
Super Lloyd wrote: but I didn't use new...
That has nothing to do with it.
The use of 'new' is specific to a certain kind of finite resource (memory).
Your class on the other hand must manage ALL of the resources that it owns. So it must clean it up.
|
|
|
|
|
I wrote a little test program to answer all my questions!! :P
To answer the one on this page, no need to call .reset()!
A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station....
_________________________________________________________
My programs never have bugs, they just develop random features.
|
|
|
|
|
I think that what Eric meant above was that if you share the resource handle through the shared_ptr then you should not CloseHandle prematurely, when others still are using it. Thus you need to examine the ref count before CloseHandle, or else you will have invalid objects.
Life is too shor
|
|
|
|
|
Errr, we're talking about the destructor and said shared_ptr object is about to be destroyed - it doesn't have to be reset! Would be a dumb kind of smart pointer if you still have to tell it to decrease the reference before destroying it...
|
|
|
|
|
A little test program clarified everything! ^^
All non pointer member's destructor get called at all time, whatever else might be...
I was just not sure initially! ^^
A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station....
_________________________________________________________
My programs never have bugs, they just develop random features.
|
|
|
|
|
Yes, I was talking generally and as you say the shared_ptr class does this for you so no need to worry about it.
As for things like handles, in your example, it is best to call a close on them before your class destructor is called, ie, do your tidy up as early as you can.
==============================
Nothing to say.
|
|
|
|
|
The destructor will be called on data, so there's no need to call reset.
Steve
|
|
|
|
|
Thanks!
Indeed I though of writing a test program and found that out too!
A train station is where the train stops. A bus station is where the bus stops. On my desk, I have a work station....
_________________________________________________________
My programs never have bugs, they just develop random features.
|
|
|
|