我声明了一个私有变量
vector<SomeClass> theVector;
我的 SomeClass 课程中的某个地方。
为什么我不能说:delete theVector
在我的 SomeClass 析构函数中?
编译器错误说:
type `class Vector<SomeClass>' argument given to `delete', expected pointer
什么预期的指针?
我声明了一个私有变量
vector<SomeClass> theVector;
我的 SomeClass 课程中的某个地方。
为什么我不能说:delete theVector
在我的 SomeClass 析构函数中?
编译器错误说:
type `class Vector<SomeClass>' argument given to `delete', expected pointer
什么预期的指针?
如果新建和删除齐头并进。
要删除某些内容,您需要通过 new 创建它(它会为您提供一个指针)。然后,您可以删除指针。您声明它在堆栈(而不是堆)上创建的向量的方式,当它超出范围时将被释放。
int main()
{
vector<SomeClass> theVector;
vector<SomeClass>* ptrVctor = new vector<SomeClass>();
delete ptrVctor; // ptrVctor must be deleted manually
// theVector destroyed automatically here
}
在 C++ 中(与 Java 不同),您可以在堆栈或堆上创建对象。正如您所做的那样,在堆栈上创建它的一个示例是:
vector<SomeClass> theVector;
当堆栈帧消失时(通常当您从创建该对象的函数返回时,该对象将超出范围。
在堆上创建对象可以让它们比创建它们的函数更长寿,你可以通过执行以下操作来做到这一点:
vector<SomeClass> *theVectorPtr = new vector<SomeClass>();
然后,您可以将theVectorPtr
指针传递回函数的调用者(或将其全局存储,无论您想要什么)。
为了摆脱堆上的对象,你明确地删除它:
delete theVectorPtr;
在您的代码中的某处。
删除堆上的对象会结束该对象的范围,就像从函数返回结束在堆栈上创建的变量的范围一样。
如果一个对象(而不是一个值)被定义为一个类成员变量,那么它的存储总是与该类的对象实例相关联。
因此,如果包含对象是在堆栈上分配的,那么当堆栈展开时,该对象和字段将消失。
如果包含对象是在堆上分配的,那么当整个包含对象因删除而死亡时,字段对象将死亡。
如果它是一个指针,您只会将删除应用于一个字段,因为与包含对象一起存储的所有内容都是某个其他内存区域的地址,并且您正在删除该区域中的材料。
这是因为 theVector 不是指针,所以delete' expects. "Expected pointer" means the operand of
delete' 必须是指针。
将此与
int theInt;
delete theInt;
它肯定会产生类似于你得到的错误。
TheVector 的内存是为 SomeClass 对象分配的内存的一部分,因此您不能在不删除整个 SomeClass 对象的情况下删除它。TheVector 的内存将在 SomeClass 对象被破坏时自动释放。
要销毁向量中保存的所有对象,您将执行以下操作:
theVector.resize(0);
当向量超出范围时,这将自动发生。
c++ 让您可以灵活地在堆栈和堆中创建对象。当通过 new 运算符在堆中创建对象时,如下所示,它返回指向堆中对象的指针。
ClassA * pobj_class = new ClassA();
对于在堆栈中创建的对象,构造函数返回对象而不是指针,如下所示。
ClassA obj_class();
当变量(obj_class)超出范围时,堆栈对象会自动销毁,但在堆上创建的对象会永远存在。因此,要销毁堆对象,c++ 为您提供了删除运算符,该运算符将指针作为参数并销毁指针指向的对象。