I'm using auto_ptr<>
which uses an array of class pointer type so how do I assign a value to it.
e.g.
auto_ptr<class*> arr[10];
How can I assign a value to the arr
array?
I'm using auto_ptr<>
which uses an array of class pointer type so how do I assign a value to it.
e.g.
auto_ptr<class*> arr[10];
How can I assign a value to the arr
array?
You cannot use auto_ptr with array, because it calls delete p
, not delete [] p
.
You want boost::scoped_array or some other boost::smart_array :)
int * a = new a[0]
HAS TO be deleted with delete [] a
, not delete a
, therefore, having an AP to that will result in UB –
Glyoxaline delete
rather than delete[]
? –
Glyoxaline auto_ptr
to an array of 0 length (illegal as in Undefined Behavior). The reason is as simple as this: if a pointer has been returned via call to new[]
, deleting it with mere delete
results in UB - no exceptions. –
Glyoxaline If you have C++0x (e.g. MSVC10, GCC >= 4.3), I'd strongly advise to use either a std::vector<T>
or a std::array<T, n>
as your base object type (depending on whether the size is fixed or variable), and if you allocate this guy on the heap and need to pass it around, put it in a std::shared_ptr
:
typedef std::array<T, n> mybox_t;
typedef std::shared_ptr<mybox_t> mybox_p;
mybox_p makeBox() { auto bp = std::make_shared<mybox_t>(...); ...; return bp; }
Arrays and auto_ptr<>
don't mix.
From the GotW site:
Every
delete
must match the form of itsnew
. If you use single-object new, you must use single-object delete; if you use the array form of new, you must use the array form of delete. Doing otherwise yields undefined behaviour.
I'm not going to copy the GotW site verbatim; however, I will summarize your options to solve your problem:
Roll your own auto array
1a. Derive from auto_ptr. Few advantages, too difficult.
1b. Clone auto_ptr code. Easy to implement, no significant space/overhead. Hard to maintain.
So the bottom line is to use a vector<>
instead of C-style arrays.
As everyone said here, don't mix arrays with auto_ptr. This must be used only when you've multiple returns where you feel really difficult to release memory, or when you get an allocated pointer from somewhere else and you've the responsibility to clean it up before existing the function.
the other thing is that, in the destructor of auto_ptr it calls delete operator with the stored pointer. Now what you're passing is a single element of an array. Memory manager will try to find and free up the memory blocks allocated starting from the address you're passing. Probably this might not be existing heap where all allocations are maintained. You may experience an undefined behavior like crash, memory corruption etc. upon this operation.
© 2022 - 2024 — McMap. All rights reserved.