|
Hamed Mosavi wrote: Will compiler uses size of the type of the pBigInt to delete pBigInt, or keeps track of all allocated size and deletes that. If this is the case, it might be possible to write something like this:
myStruct* pStruct = new myStruct(nSize);
where nSize is not equal to sizeof(myStruct);.
you cannot do that, but
myStruct* pStruct = (myStruct*) new BYTE[nSize];
and later
delete [] pStruct;
works fine.
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
|
|
|
|
|
Thanks guys. Working with more confidence now.
// "In the end it's a little boy expressing himself." Yanni
while (I_am_alive) { cout<<"I love programming."; }
|
|
|
|
|
Hamed Mosavi wrote: If this is the case, it might be possible to write something like this:
myStruct* pStruct = new myStruct(nSize);
where nSize is not equal to sizeof(myStruct);.
it is possible to write like this, in this case compiler creates one object of "myStruct" and calls the overloaded constructor something like "myStruct(int)" or "myStruct(size_t)" whichever you defined.
|
|
|
|
|
Rajkumar R wrote: alls the overloaded constructor
No. That was just an example to see if there is any similar syntax that eliminates need for casting.
// "In the end it's a little boy expressing himself." Yanni
while (I_am_alive) { cout<<"I love programming."; }
|
|
|
|
|
ok. myStruct(nSize), if nSize is not sizeof(myStruct), and if it is not multiples of sizeof(myStruct) how you are thinking to use that object as myStruct. i think you want the nSize to be multiples of sizeof(myStruct), is it?
|
|
|
|
|
Rajkumar R wrote: how you are thinking to use that object as myStruct
Indeed! TAPI is the answer. It was first strange to me as well. It's like the structure holds something like strings and doesn't know the exact size of the string. When I call it once, it sometimes returns an "insufficient memory" error, then I have to get needed size and re allocate enough memory. I have to give the API a pointer to that structure which is actually a pointer to first block of the predefined size of memory.
My question was that, is it possible to get rid of casting and the type specified in new and explicitly define needed size of memory to allocate(and based on the type myStruct) the operator cast the result automatically?
Further than that, it was strange to me how delete works.
// "In the end it's a little boy expressing himself." Yanni
while (I_am_alive) { cout<<"I love programming."; }
|
|
|
|
|
Hamed Mosavi wrote: My question was that, is it possible to get rid of casting and the type specified in new and explicitly define needed size of memory to allocate(and based on the type myStruct) the operator cast the result automatically?
why not, C++ is powerful man,
#include<new>
#include<iostream>
using namespace std;
struct myStruct
{
myStruct( )
{
cout << "Construction myStruct." << this << endl;
};
~myStruct( )
{
cout << "Destructing myStruct." << this << endl;
};
void *__CRTDECL operator new(size_t size, size_t realSize)
{
return malloc(realSize);
}
void __CRTDECL operator delete(void * ptr, size_t)
{
free (ptr);
}
};
int main( )
{
const int nSize = sizeof(myStruct) + 100;
myStruct* pStruct1 = new (nSize) myStruct;
delete pStruct1 ;
char preAllocatedBuffer[nSize];
myStruct* pStruct2 = ::new( &preAllocatedBuffer[0] ) myStruct;
<code>pStruct2->~myStruct();</code>
}
some of the techniques,
you can pass the custom size to the overloaded new operator see the 1) in the code.
And there is also a placement new operator that is defined if you #include <new>, in this you can pass pre allocated buffer and get the class created see 2) in the code, in the placement case donot use delete as the buffer need not to be freed by the class.
and also if size is multiple of myStruct,
straitforward
myStruct* pStruct2 = ::new myStruct[2];
modified on Friday, February 29, 2008 6:58 AM
|
|
|
|
|
Thanks.
This:
Rajkumar R wrote: the placement new
...
::new( &preAllocatedBuffer[0] ) myStruct;
was really interesting. Thank you. I appreciate it.
The first solution (Overloading new operator is nice either) but in this very special situation, I don't have myStruct (it's in fact LINEINITIALIZEEXPARAMS.)
By the way, great tips and techniques. Thanks for sharing.
Rajkumar R wrote: C++ is powerful
Absolutely I love it(my signature.) I wish it had built in support for multi threading.
// "In the end it's a little boy expressing himself." Yanni
while (I_am_alive) { cout<<"I love programming."; }
|
|
|
|
|
Hamed Mosavi wrote: I wish it had built in support for multi threading.
Multiple threads, Process Spawning, etc, OS concepts not language specific, OS can expose the API so that languages can pick it up. You have to be happy that C, C++ can directly access those API in our program, while some language has layers in between.
|
|
|
|
|
Rajkumar R wrote: OS concepts not language specific
Your right. What a bad mistake. It was a typo
// "In the end it's a little boy expressing himself." Yanni
while (I_am_alive) { cout<<"I love programming."; }
|
|
|
|
|
Thanks for the BYTE recall. Actually char and unsigned char work differently sometimes.
// "In the end it's a little boy expressing himself." Yanni
while (I_am_alive) { cout<<"I love programming."; }
|
|
|
|
|
Hello,
so far I create dynamic arrays like this
int elements=3;<br />
testclass* parray= new testclass [elements];
Id like to use the same approach on a the testclass with a private constructor without changing the source code of the testclass.
class testclass <br />
{<br />
public: static testclass* New();<br />
<br />
private: testclass(){};<br />
~testclass(){};<br />
};
-----------------------------------
testclass* testclass::New()
{
return new testclass;
};
I would be thankful for any advices..
best regards
tobse
|
|
|
|
|
So what's your question/problem?
"Normal is getting dressed in clothes that you buy for work and driving through traffic in a car that you are still paying for, in order to get to the job you need to pay for the clothes and the car and the house you leave vacant all day so you can afford to live in it." - Ellen Goodman
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
The only solution I see is to work with an array of pointers to testclass objects instead of an array of testclass objects. Then you'll need to initialize each pointer by calling testclass::New. This is because an array needs to construct each of its elements, thus calling the constructor.
int elements=3;
testclass** parray= new testclass* [elements];
for (int i=0;i<elements; i++
{
parray[i] = testclass::New();
}
But it's a little bit ugly if you want my opinion
|
|
|
|
|
Hi,
great, it works ! Thank you.
Accessing the objects with parray[i]-> and deleting with delete [] parray works fine.
tobse
|
|
|
|
|
tobse wrote: and deleting with delete [] parray works fine
Yes, but it leaks memory. You have first to delete each element alone and then delete the array.
Remember that for each call to new, there should be a call to delete associated and for each call to new[], there should be a call to delete[] associated.
|
|
|
|
|
What is your doubt? Cannot you pass the array size to your static method New() ?
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
|
|
|
|
|
Hi,
to pass the array size I need to rewrite the new() method of the testclass, but rewriting the testclass is not possible
thanks tobse
|
|
|
|
|
Hi ,
As long as the constructor of my testclass is private compilation fails.
I can not construct an array of testclasses like this, because I try to access to a private member.
testclass* parray= new testclass [elements];
of course my example works when the constructor is public. Simply changing the constructor to public is not wished.
tobse
|
|
|
|
|
Use a std::vector instead.
Steve
|
|
|
|
|
Thanks, I tried this solution and so far I can not see disadvantages.
std::vector<testclass*>vectortestclass;<br />
<br />
testclass* t=0;<br />
int elements=5;<br />
for (int i=0;i<elements;++i)<br />
{<br />
t=testclass::New();<br />
vectortestclass.push_back(t);<br />
};
// Delete
for (int j=0;j<vectortestclass.size();++j)<br />
{
// The delete() function is a public member of testclass and runs the destructor.
vectortestclass[j]->Delete(); <br />
};<br />
vectortestclass.clear();
tobse
|
|
|
|
|
Why store pointers? Instead use std::vector<testclass> in which case you don't need to worry about deleting them.
Steve
|
|
|
|
|
Hi Steve,
sure this would be more comfortable but I dont see the the solution when the new operator is private . I would be glad for any advice if I am wrong.
Tobse
modified on Tuesday, March 4, 2008 7:05 AM
|
|
|
|
|
If the constructor is private the only possible caller is the class itself. Therefore only a public method of the class itself can call it. I don't see how you can use it in a vector as I've shown without altering the source.
Steve
|
|
|
|
|
I have to do an application for reading xml files with mfc vc++. I have to work with xerces. I have downloaded the binary distribution, but I don't know how to go on.
Can someone help me? what will be the next step ?
Sorry, I'm just a beginner!
Thanks!
|
|
|
|