14

我声明了一个私有变量

vector<SomeClass> theVector;

我的 SomeClass 课程中的某个地方。

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

编译器错误说:

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

什么预期的指针?

4

7 回答 7

20

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

要删除某些内容,您需要通过 new 创建它(它会为您提供一个指针)。然后,您可以删除指针。您声明它在堆栈(而不是堆)上创建的向量的方式,当它超出范围时将被释放。

int main()
{
    vector<SomeClass> theVector;

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


    delete ptrVctor;   // ptrVctor must be deleted manually
    // theVector destroyed automatically here
}
于 2008-12-20T03:01:23.263 回答
8

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

vector<SomeClass> theVector;

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

在堆上创建对象可以让它们比创建它们的函数更长寿,你可以通过执行以下操作来做到这一点:

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

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

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

delete theVectorPtr;

在您的代码中的某处。

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

于 2008-12-20T03:40:04.340 回答
3

如果一个对象(而不是一个值)被定义为一个类成员变量,那么它的存储总是与该类的对象实例相关联。

因此,如果包含对象是在堆栈上分配的,那么当堆栈展开时,该对象和字段将消失。

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

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

于 2008-12-20T03:01:11.733 回答
2

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

将此与

int theInt;
delete theInt;

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

于 2008-12-20T03:00:51.813 回答
2

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

于 2008-12-20T03:02:16.943 回答
2

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

theVector.resize(0);

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

于 2009-01-12T02:10:23.850 回答
1

c++ 让您可以灵活地在堆栈和堆中创建对象。当通过 new 运算符在堆中创建对象时,如下所示,它返回指向堆中对象的指针。

ClassA * pobj_class = new ClassA();

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

ClassA obj_class();

当变量(obj_class)超出范围时,堆栈对象会自动销毁,但在堆上创建的对象会永远存在。因此,要销毁堆对象,c++ 为您提供了删除运算符,该运算符将指针作为参数并销毁指针指向的对象。

于 2008-12-20T06:08:33.400 回答