析构函数C ++:输入'***'参数给'删除',预期指针

时间:2008-12-20 02:58:23

标签: c++ destructor

我宣布了一个私人变量

vector<SomeClass> theVector;

我的SomeClass类中的某个地方。

为什么我不能在我的SomeClass析构函数中说delete theVector

编译错误说:

 type `class Vector<SomeClass>' argument given to `delete', expected pointer 

预期指针是什么?

7 个答案:

答案 0 :(得分:19)

如果新的和删除齐头并进。

删除你需要通过new创建它的东西(它给你一个指针)。然后,您可以删除指针。您声明向量的方式是在堆栈(而不是堆)上创建的,并且当它超出范围时将被释放。

int main()
{
    vector<SomeClass> theVector;

    vector<SomeClass>* ptrVctor = new vector<SomeClass>();


    delete ptrVctor;   // ptrVctor must be deleted manually
    // theVector destroyed automatically here
}

答案 1 :(得分:8)

在C ++中(与Java不同),您可以在堆栈或堆上创建对象。正如您所做的那样,在堆栈上创建它的一个例子是:

vector<SomeClass> theVector;

当堆栈帧消失时(通常是从创建对象的函数返回时),此对象超出范围。

在堆上创建对象允许它们比创建它们的函数更长,并且通过执行以下操作来实现:

vector<SomeClass> *theVectorPtr = new vector<SomeClass>();

然后,您可以将theVectorPtr指针传递回函数的调用者(或者将其全局存储,无论您想要什么)。

为了摆脱堆上的对象,你明确删除它:

delete theVectorPtr;

代码中的某处。

删除堆上的对象会结束该对象的范围,就像从函数返回结束堆栈中创建的变量范围一样。

答案 2 :(得分:3)

如果将对象(而不是值)定义为类成员变量,则其存储始终绑定到该类的对象实例。

因此,如果在堆栈上分配了包含对象,那么当堆栈展开时,该对象和字段将会死亡。

如果在堆上分配了包含对象,那么当整个包含对象因删除而死亡时,字段对象将会死亡。

如果这是一个指针,你将只对字段应用删除,因为与包含对象一起存储的所有内容都是某个其他内存区域的地址,并且您要删除该区域中的材料。

答案 3 :(得分:2)

theVector的内存是为SomeClass对象分配的内存的一部分,因此在不删除整个SomeClass对象的情况下无法删除它。当SomeClass对象被破坏时,将自动释放theVector的内存。

答案 4 :(得分:2)

要销毁向量中保存的所有对象,您将执行以下操作:

theVector.resize(0);

当向量超出范围时,这将自动发生。

答案 5 :(得分:1)

这是因为theVector不是指针,delete' expects. "Expected pointer" means the operand of delete'必须是指针。

将此与

进行比较
int theInt;
delete theInt;

肯定会产生类似于你得到的错误。

答案 6 :(得分:1)

c ++为您提供了在堆栈和堆中创建对象的灵活性。 当通过new运算符在堆中创建对象时,如下所示,它返回指向堆中对象的指针。

ClassA * pobj_class = new ClassA();

对于在堆栈中创建的对象,构造函数返回对象而不是指针,如下所示。

ClassA obj_class();

并且当变量(obj_class)超出范围时自动销毁堆栈对象,但是在堆上创建的对象永远存在。所以要破坏堆对象c ++给你删除操作符,它将指针作为参数并销毁指针所指向的对象到。