2013-09-22 130 views
2

我的C++类有一个析构函数,它试图删除std :: vector和std :: array实例变量。不能删除std :: vector&std :: array?

#include <iostream> 
#include <vector> 
#include <array> 

int main() 
{ 
    std::array<int, 3> foo; 
    std::vector< std::array<float, 4> > vertices; 

    foo[0] = 1; 
    foo[1] = 2; 
    foo[2] = 3; 
    std::cout << foo[0] << std::endl; 
    delete foo; 
    delete vertices; 

    return 0; 
} 

我不知道如何正确释放内存 - 我怎么不能删除这些变量?

clang++ -std=c++11 -stdlib=libc++ -Weverything ccc.cpp 
ccc.cpp:14:2: error: cannot delete expression of type 'std::array<int, 3>' 
     delete foo; 
     ^ ~~~ 
ccc.cpp:15:2: error: cannot delete expression of type 'std::vector<std::array<float, 4> 
     >' 
     delete vertices; 
     ^ ~~~~~~~~ 
ccc.cpp:18:2: warning: C++98 requires newline at end of file [-Wc++98-compat-pedantic] 
} 
^ 
+7

你没有用'new'分配任何东西,你为什么要用'delete'来释放某些东西?这些是自动变量 - 当它们超出范围时它们会自动销毁。 –

+0

即使它们是类中的成员实例变量? – ejang

+0

是的,班级成员没有隐藏的“新”附件。 – chris

回答

8

删除这些变量?您应该使用delete唯一的“变量”是您通过new分配的变量。你在这段代码中分配了new的任何东西吗?所以,不要试图去delete什么。

对象foovertices是本地对象自动存储期限。这些对象的内存自动分配并自动释放。你不能自己做。这完全不在你的控制范围之内。

如果要手动控制内存分配,则必须使用new动态创建这些对象。例如,

std::array<int, 3> *foo = new std::array<int, 3>(); 
... 
(*foo)[0] = 1; 
(*foo)[1] = 2; 
(*foo)[2] = 3; 
... 
delete foo; 

以上将工作。但在你的例子中没有真正的理由涉及动态内存。它的工作原理与自动对象一样完美。只要停止尝试delete他们。

delete预计指针作为参数。当您通过new分配对象时,您将通过指针访问这些对象。这些指针将在稍后传递给delete来销毁这些对象。在这个代码中没有一个适用。

+0

如果std :: array的内容是一个对象指针,该怎么办?像“std :: array myArray1;”。如果它是“Object * myArray2 [10];”,那么我就可以调用“delete [] myArray2;”,它也会调用Object实例的析构函数。我可以调用“delete [] myArray1;” ? – phoad

+0

@phoad:我不确定我是否理解你的评论。如果'myArray2'被声明为'Object * myArray2 [10]',那么你将不能**删除[] myArray2'。 – AnT

+0

我记得是“delete [] arr;”会在“arr”中调用每个对象的析构函数并释放它们。 http://www.cplusplus.com/reference/new/operator%20delete[]/“operator delete []是一个常规函数,可以像其他函数一样显式调用,但在C++中,delete []是一个运算符具有非常特定的行为:使用delete []运算符的表达式首先为数组中的每个元素调用适当的析构函数(如果它们是类类型的),然后调用数组解除分配函数。“它应该是Object arr [] = new Object [10],而不是Object * arr []? – phoad