这是c ++中有效的删除操作吗?

时间:2011-08-19 01:18:10

标签: c++ pointers reference

我的代码中有vector<some_struct&> array,每当我想在向量中添加一些对象时,我都使用array.push_back(*new some_struct)。现在我想知道我是否应该在清除数组之前删除数组中的每个对象(使用delete&amp; array [i])?

5 个答案:

答案 0 :(得分:9)

vector<some_struct&> array无效,期限。

用于实例化标准库容器的类型(或类型)必须是对象类型。引用类型(如some_struct&)不是对象类型。

根据定义,“容器是存储其他对象的对象”(来自C ++ 03和C ++ 0x中的§23.1/ 1)。引用不是对象。

如果您实例化的容器的类型不符合容器所要求的类型,则行为是未定义的:您的代码可能编译也可能不编译,如果编译完成,谁知道结果是什么;什么都可能发生..

答案 1 :(得分:3)

这怎么编译?对于我在过去5年中使用的任何编译器而言,这不是合法的C ++代码。

答案 2 :(得分:2)

向量引用表示push_back将数据复制到容器中。在您的示例中,不是指向的指针,而是复制每个结构的内容。因此,如果使用* new my_struct,在使用它们将数据传递给容器之后,对结构分配的内存的引用将会丢失,这意味着您需要将这些指针存储到您在某处可以分配的每个结构中释放它们,否则你会发生内存泄漏。

如果你想保留指针,容器应该是vector<some_struct*>,你可以通过new some_struct并且应该(例如)用delete array [i]释放它们。

答案 3 :(得分:0)

如果您的向量已声明为vector<some_struct&> array,则array.push_back(new some_struct)不起作用。 array.push_back(some_struct())将起作用,在这种情况下,您无需调用delete。

答案 4 :(得分:0)

每次执行此操作时,您将丢失分配的内存。您实际上是在创建该数据的副本,但是一旦此过程完成,原始文件就会丢失在内存中。在复制之后可以在某处保留外部引用,或使用指针向量而不是引用。