在类中使用 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<T>
来代表您的offset
。
我还没有看到带有malloc
和free
但没有new
和delete
的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的主要内容,如果未能解决你的问题,请参考以下文章