【发布时间】: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 :不,这与它没有任何关系。
标签: c++ memory-management