是否可以在C ++中使用delete删除C POD?

时间:2011-01-23 12:43:22

标签: c++ data-structures types delete-operator pod

有像

这样的结构
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;
}

在这个结构上,如果清除内存形式就足够了吗?

3 个答案:

答案 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库提供的智能指针类;这些都有助于您正确的内存管理。