auto_ptr array
-
Like this : auto_ptr p(new int(10));
Hi _AnShUmAn_, It is not correct code. Because the destructor of auto_ptr will use delete other than delete[]. And it will lead to memory leak. Any ideas or comments? regards, George
-
Hi _AnShUmAn_, It is not correct code. Because the destructor of auto_ptr will use delete other than delete[]. And it will lead to memory leak. Any ideas or comments? regards, George
George_George wrote:
It is not correct code.
TRUE. Actually the code is correct, but is not a solution for your OP one. :)
George_George wrote:
Because the destructor of auto_ptr will use delete other than delete[]. And it will lead to memory leak.
FALSE. ;P It allocates just
1
integer (and initialise it to 10) hence no memory leaks afterdelete
. BTW: no compiler error for the code belowauto_ptr<int[10]> pi(new int[10]);
:)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke -
George_George wrote:
It is not correct code.
TRUE. Actually the code is correct, but is not a solution for your OP one. :)
George_George wrote:
Because the destructor of auto_ptr will use delete other than delete[]. And it will lead to memory leak.
FALSE. ;P It allocates just
1
integer (and initialise it to 10) hence no memory leaks afterdelete
. BTW: no compiler error for the code belowauto_ptr<int[10]> pi(new int[10]);
:)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain ClarkeHi, CPallini, 1.
CPallini wrote:
George_George wrote: Because the destructor of auto_ptr will use delete other than delete[]. And it will lead to memory leak. FALSE. It allocates just 1 integer (and initialise it to 10) hence no memory leaks after delete.
I am confused. We are talking about destructor of auto_ptr? Why do you say "allocates"?? Could you provide more description please? :-) 2.
CPallini wrote:
BTW: no compiler error for the code below auto_ptr pi(new int[10]);
No, I have compile errors in MSVC 2008.
1>Compiling...
1>main.cpp
1>d:\visual studio 2008\projects\test0401\test0401\main.cpp(7) : error C2664: 'std::auto_ptr<_Ty>::auto_ptr(_Ty (*)) throw()' : cannot convert parameter 1 from 'int *' to 'int (*)[10]'
1> with
1> [
1> _Ty=int [10]
1> ]
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style castregards, George
-
Hi, CPallini, 1.
CPallini wrote:
George_George wrote: Because the destructor of auto_ptr will use delete other than delete[]. And it will lead to memory leak. FALSE. It allocates just 1 integer (and initialise it to 10) hence no memory leaks after delete.
I am confused. We are talking about destructor of auto_ptr? Why do you say "allocates"?? Could you provide more description please? :-) 2.
CPallini wrote:
BTW: no compiler error for the code below auto_ptr pi(new int[10]);
No, I have compile errors in MSVC 2008.
1>Compiling...
1>main.cpp
1>d:\visual studio 2008\projects\test0401\test0401\main.cpp(7) : error C2664: 'std::auto_ptr<_Ty>::auto_ptr(_Ty (*)) throw()' : cannot convert parameter 1 from 'int *' to 'int (*)[10]'
1> with
1> [
1> _Ty=int [10]
1> ]
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style castregards, George
George_George wrote:
I am confused. We are talking about destructor of auto_ptr? Why do you say "allocates"?? Could you provide more description please?
I report below _AnShUmAn_ code for reference.
auto_ptr<int> p(new int(10));
In the above expression, the
new
operator allocates oneint
and initialise it with the number10
.George_George wrote:
No, I have compile errors in MSVC 2008.
Well, I have VS2005, and no errors here. However I've to admit I overlooked the following (serious) warning:
warning C4156: deletion of an array expression without using the array form of 'delete'; array form substituted
[...]:)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke -
George_George wrote:
I am confused. We are talking about destructor of auto_ptr? Why do you say "allocates"?? Could you provide more description please?
I report below _AnShUmAn_ code for reference.
auto_ptr<int> p(new int(10));
In the above expression, the
new
operator allocates oneint
and initialise it with the number10
.George_George wrote:
No, I have compile errors in MSVC 2008.
Well, I have VS2005, and no errors here. However I've to admit I overlooked the following (serious) warning:
warning C4156: deletion of an array expression without using the array form of 'delete'; array form substituted
[...]:)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain ClarkeThanks CPallini, 1. -------------------- deletion of an array expression without using the array form of 'delete' -------------------- Means auto_ptr will use delete other than delete[] is destructor of auto_ptr? 2. -------------------- array form substituted -------------------- What means "array form substituted"? regards, George
-
Thanks CPallini, 1. -------------------- deletion of an array expression without using the array form of 'delete' -------------------- Means auto_ptr will use delete other than delete[] is destructor of auto_ptr? 2. -------------------- array form substituted -------------------- What means "array form substituted"? regards, George
George_George wrote:
Means auto_ptr will use delete other than delete[] is destructor of auto_ptr?
I think so.
George_George wrote:
What means "array form substituted"?
as the compiler output window shows
_Ty=int [10]
i.e. internal type _Ty (blindly) substitutes an array form. Your example, IMHO shows: (1) The
std::auto_ptr
though helpful is not a panacea. (2) VC++ compiler is smart. :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke -
George_George wrote:
Means auto_ptr will use delete other than delete[] is destructor of auto_ptr?
I think so.
George_George wrote:
What means "array form substituted"?
as the compiler output window shows
_Ty=int [10]
i.e. internal type _Ty (blindly) substitutes an array form. Your example, IMHO shows: (1) The
std::auto_ptr
though helpful is not a panacea. (2) VC++ compiler is smart. :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain ClarkeThanks CPallini, 1. The compiler deduce _Ty,
_Ty=int [10]
is because of the following code?
auto_ptr<int[10]>
2. In your sample, compiler will make A. one auto_ptr object wrapps an int array on heap; or B. ten auto_ptr objects and each object wrapps an int on heap? regards, George
-
Thanks CPallini, 1. The compiler deduce _Ty,
_Ty=int [10]
is because of the following code?
auto_ptr<int[10]>
2. In your sample, compiler will make A. one auto_ptr object wrapps an int array on heap; or B. ten auto_ptr objects and each object wrapps an int on heap? regards, George
1. Yes. 2. A. :)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke -
1. Yes. 2. A. :)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain ClarkeThanks CPallini, I read the compile error message you posted, -------------------- warning C4156: deletion of an array expression without using the array form of 'delete' -------------------- I think your code will have memory leak potentially? Because delete other than delete[] will work on the array? regards, George
-
Thanks CPallini, I read the compile error message you posted, -------------------- warning C4156: deletion of an array expression without using the array form of 'delete' -------------------- I think your code will have memory leak potentially? Because delete other than delete[] will work on the array? regards, George
George_George wrote:
I think your code will have memory leak potentially? Because delete other than delete[] will work on the array?
The
delete
syntax will be used (insted of thedelete []
one). About potential memory leaks, from MSDN [^] The following two cases produce undefined results: using the array form of delete (delete [ ]) on an object and using the nonarray form of delete on an array. :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke -
George_George wrote:
I think your code will have memory leak potentially? Because delete other than delete[] will work on the array?
The
delete
syntax will be used (insted of thedelete []
one). About potential memory leaks, from MSDN [^] The following two cases produce undefined results: using the array form of delete (delete [ ]) on an object and using the nonarray form of delete on an array. :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain ClarkeYou mean your code will cause undefined behavior? CPallini? regards, George
-
You mean your code will cause undefined behavior? CPallini? regards, George
-
Sorry led mike, What is your reply to my original question? How to make an auto_ptr array and initialize it? regards, George
-
So this way he can read the answer once again, just to be sure he read it correctly ;P
Cédric Moonen Software developer
Charting control [v1.3] -
You mean your code will cause undefined behavior? CPallini? regards, George
George_George wrote:
You mean your code will cause undefined behavior? CPallini?
Well, MSDN says it and of course I cannot object to Microsoft. See here [^]. :)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarkemodified on Tuesday, April 1, 2008 1:55 PM
-
Sorry led mike, What is your reply to my original question? How to make an auto_ptr array and initialize it? regards, George
George_George wrote:
What is your reply to my original question?
I have no answer for it. I don't understand the premise. auto_ptr should be used to implement exception safe locality and I don't understand the need to have an array of int pointers for local use. I would just put the ints on the stack and I would not use an array I would use a vector.
led mike
-
Hello everyone, I have tried to initialize an auto_ptr array, but failed. My C++ Programming Language book does not contain a sample about how to initialize an auto_ptr array. (not an auto_ptr pointing to an array, which is not legal) Any solutions?
#include <memory>
using namespace std;
int main()
{
auto_ptr<int[]> pi (new int[10]); // compile errorauto\_ptr<int> pi (new int\[10\]); // compile error return 0;
}
thanks in advance, George
As you have already discovered auto_ptr is not designed to work as an array of pointers. There are multiple solutions to your problem and they are described in the below links. http://www.codeproject.com/KB/cpp/COAP.aspx[^] http://www.gotw.ca/gotw/042.htm[^] If you are just interested finding out how auto_ptr can be used with an array then above links are suffice. but in real use, you might want to take a look at the boost smart pointer library. you can also use the shared_ptr as it is designed to work with STL containers. Ankita
-
George_George wrote:
You mean your code will cause undefined behavior? CPallini?
Well, MSDN says it and of course I cannot object to Microsoft. See here [^]. :)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarkemodified on Tuesday, April 1, 2008 1:55 PM
Sure, CPallini! About my original question, your option is we can not define an auto_ptr array and do initialization at the same time? regards, George
-
George_George wrote:
What is your reply to my original question?
I have no answer for it. I don't understand the premise. auto_ptr should be used to implement exception safe locality and I don't understand the need to have an array of int pointers for local use. I would just put the ints on the stack and I would not use an array I would use a vector.
led mike
Hi led mike, int is just used for demo purpose. You can use user defined data types, like class Foo. How to define an array of auto_ptr and initialization at the same time? regards, George
-
So this way he can read the answer once again, just to be sure he read it correctly ;P
Cédric Moonen Software developer
Charting control [v1.3]I agree, Cedric! Confirmation is good practice for the flat world. Since you are not sit next to me, or climb through the network cable. :-) regards, George