【问题标题】:Using malloc/free with classes在类中使用 malloc/free
【发布时间】: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 :不,这与它没有任何关系。

标签: c++ memory-management


【解决方案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()......调用析构函数的方式,虽然是允许的,但真的很难看,感觉就像一个黑客(这是) .

    【讨论】:

      猜你喜欢
      • 2014-05-05
      • 2023-04-07
      • 2020-12-10
      • 2011-06-06
      • 2015-05-28
      • 2011-12-19
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      相关资源
      最近更新 更多