我有一些代码使用malloc / realloc为类分配内存,然后使用free再次删除它们。以下是我正在使用的摘录:
void NewSubInstances()
// Invoked by each worker thread to grow the subinstance array and
// initialize each new subinstance using a particular method defined
// by the subclass.
{
if (slavetotalspace >= totalobj) { return; }
//Remember current large size
G4int originaltotalspace = slavetotalspace;
//Increase its size by some value (purely arbitrary)
slavetotalspace = totalobj + 512;
//Now re-allocate new space
offset = (T *) realloc(offset, slavetotalspace * sizeof(T));
if (offset == 0)
{
G4Exception("G4VUPLSplitter::NewSubInstances()",
"OutOfMemory", FatalException, "Cannot malloc space!");
return;
}
//The newly created objects need to be initialized
for (G4int i = originaltotalspace; i < slavetotalspace; i++)
{
offset[i].initialize();
}
}
void FreeSlave()
// Invoked by all threads to free the subinstance array.
{
if (!offset) { return; }
free( offset);
offset = 0;
}
我知道malloc不会调用类的构造函数,但这是由initialize函数处理的。我的问题是:如何处理释放内存的方式,也会调用类的析构函数(类通常有动态分配的内存,需要删除它)?
谢谢!
答案 0 :(得分:1)
如何处理释放内存的方式也会调用类的析构函数(类通常有动态分配的内存,需要删除它)?
您的问题的答案如下:
void FreeSlave()
{
if (!offset)
{ return; }
// call destructors explicitly
for(G4int index = 0; index < slavetotalspace; ++index)
offset[index].~T();
free( offset);
offset = 0;
}
那就是说,不要在C ++中使用malloc / realloc / free(不,即使任何借口都在这里)。虽然它可能会起作用(对此不太确定),但这段代码模糊不清/具有非明显的依赖性,易碎,难以理解,并且违反了最少惊喜的原则。
另外,请不要将你的指针称为“偏移”,也不要在C ++中使用C风格的强制转换(这是不好的做法)。
答案 1 :(得分:0)
您可以使用:
void FreeSlave()
{
if (!offset) { return; }
for (G4int i = slavetotalspace; i != 0; --i) {
offset[i - 1].~T();
}
free(offset);
offset = 0;
}
答案 2 :(得分:0)
我建议使用destroy()
方法...因为你已经initialize()
...调用析构函数的方式虽然是允许的,但实际上很丑陋,感觉就像一个黑客(是)。