在类中使用 malloc/free

Posted

技术标签:

【中文标题】在类中使用 malloc/free【英文标题】:Using malloc/free with classes 【发布时间】:2014-02-18 12:39:38 【问题描述】:

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

谢谢!

【问题讨论】:

在 C 中你没有类,在 C++ 中你不应该使用malloc/free。你想写哪一个,为什么要这样写? 你没有说为什么你不能使用 new 和 delete 自动调用构造函数/析构函数。有什么原因吗? 即使您有一个“原始字节数组”(例如,char*),这会导致您(可能是“纯 C”程序员)使用*alloc,您也可以使用@987654326 @ 和 delete。只是一个长镜头,但您可以使用std::vector&lt;T&gt; 来代表您的offset 我还没有看到带有mallocfree 但没有newdelete 的C++ 编译器。用 new 和 delete 替换 malloc 和 free,让您的生活更轻松。您仍然可以拨打您的init method @Theolodus :不,这与它没有任何关系。 【参考方案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 风格的强制转换(这是不好的做法)。

【讨论】:

根据提供的代码,offset 已经是T* 类型,并且指针拥有T 的数组。【参考方案2】:

你可以使用:

void FreeSlave()

    if (!offset)  return; 
    for (G4int i = slavetotalspace; i != 0; --i) 
        offset[i - 1].~T();
    
    free(offset);
    offset = 0;

【讨论】:

【参考方案3】:

我建议有一个destroy() 方法......因为你已经有initialize()......调用析构函数的方式,虽然是允许的,但真的很难看,感觉就像一个黑客(这是) .

【讨论】:

以上是关于在类中使用 malloc/free的主要内容,如果未能解决你的问题,请参考以下文章

malloc/free 的使用要点

使用 malloc/free 模拟 new/delete

与 malloc/free 相比,使用 C99 VLA 是个好主意吗?

11动态分配内存malloc/free

malloc/free与new/delete的区别与联系

memcached 的内存分配器是如何工作的?为什么不适用 malloc/free!?为何要使用 slabs?