使用malloc / free和类

时间:2014-02-18 12:39:39

标签: c++ memory-management

我有一些代码使用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函数处理的。我的问题是:如何处理释放内存的方式,也会调用类的析构函数(类通常有动态分配的内存,需要删除它)?

谢谢!

3 个答案:

答案 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() ...调用析构函数的方式虽然是允许的,但实际上很丑陋,感觉就像一个黑客(是)。