On 6/27/06, Richard B. Kreckel <kreckel@ginac.de> wrote:
I don't think you can get around those "extra steps" you mention. In C++, one has placement new for directed allocating. But you would have to write some additional code between #ifdefs to use it instead of malloc(3). And even doing so would not spare you extra destructor calls to avoid leaks. This function does not leak:
Ah, I didn't know about this feature of the new operator. It seems to do exactly what I want. Thanks!
void f(size_t n) { char buf[n*sizeof(GiNaC::ex)]; // you manage that memory! for (size_t i=0; i<n; ++i) { new(&buf[i*sizeof(GiNaC::ex)]) GiNaC::ex(2); }
//... cout << *reinterpret_cast<GiNaC::ex*>(&buf[0 * sizeof(GiNaC::ex)]) << endl; //...
// It is your responsibility to keep track of the reference counts:
Calling destructors is not a big deal. Do you mean anything else by "reference counts"? I couldn't find any documented way to access the reference counting information that GiNaC keeps internally.
for (size_t i=0; i<n; ++i) { reinterpret_cast<GiNaC::ex*>(&buf[i*sizeof(GiNaC::ex)])->~ex(); } }
Not sure if this helps.
Very much so. Thanks again! Igor