有像
这样的结构struct ifoo_version_42 {
int x, y, z;
char *imageData;
};
其中imageData
类似于imageData = new char[50000];
我们可以执行以下操作:
template< typename T >
void del( T a ) // we promise to use this only on C Plain Old data structs=)
{
delete a;
}
在这个结构上,如果清除内存形式就足够了吗?
答案 0 :(得分:5)
此功能模板也可以在非POD类型上“起作用”。它与直接调用delete[] a;
完全没有区别。
但是,这不会删除与imageData
关联的内存。这通常是你在析构函数中做的事情。
答案 1 :(得分:5)
删除结构不以递归方式删除其中的任何指针,因此不会释放imageData
指向的char数组。
我对你使用delete[]
感到有些困惑。您可以使用new[]
释放数组(使用delete[]
分配),或使用new
释放单个对象(使用delete
分配)。你不能混合它们,也没有说你如何分配ifoo_version_42
的一个或多个实例。例如,以下内容具有未定义的行为:
ifoo_version_42 *x = new ifoo_version_42;
del(x);
以下是可以的:
ifoo_version_42 *x = new ifoo_version_42[1];
del(x);
答案 2 :(得分:3)
如果您在del
上执行ifoo_version_42
功能,则data
指向的内存块将不会被释放; <{1}}和delete
都不会递归地工作。
delete[]
旨在用于释放delete[]
;也就是说,如果您使用arrays
分配imageData
,则应使用new[]
释放它。
delete[]
旨在用于释放单个对象:使用delete
分配ifoo_version_42
,然后您应该使用new
释放它。
(另外,永远不要将delete
用于分配有delete
的内容,或malloc()
分配给free()
的内容。)
进一步的建议:Learn the RAII idiom并使用STL或Boost库提供的智能指针类;这些都有助于您正确的内存管理。