我声明了一个私有变量
vector<SomeClass> theVector;
Run Code Online (Sandbox Code Playgroud)
我的SomeClass类中的某个地方.
为什么我不能说:delete theVector
在我的SomeClass析构函数里面?
编译错误说:
type `class Vector<SomeClass>' argument given to `delete', expected pointer
Run Code Online (Sandbox Code Playgroud)
什么预期指针?
Mar*_*ork 19
如果新的和删除齐头并进.
删除你需要通过new创建它的东西(它给你一个指针).然后,您可以删除指针.您声明向量的方式是在堆栈(而不是堆)上创建它,并且当它超出范围时将被释放.
int main()
{
vector<SomeClass> theVector;
vector<SomeClass>* ptrVctor = new vector<SomeClass>();
delete ptrVctor; // ptrVctor must be deleted manually
// theVector destroyed automatically here
}
Run Code Online (Sandbox Code Playgroud)
在C++中(与Java不同),您可以在堆栈或堆上创建对象.正如您所做的那样,在堆栈上创建它的示例如下:
vector<SomeClass> theVector;
Run Code Online (Sandbox Code Playgroud)
当堆栈帧消失时(通常从创建对象的函数返回时),此对象超出范围.
在堆上创建对象允许它们比创建它们的函数寿命更长,并且通过执行以下操作来实现:
vector<SomeClass> *theVectorPtr = new vector<SomeClass>();
Run Code Online (Sandbox Code Playgroud)
然后,您可以将theVectorPtr
指针传递回函数的调用者(或者将其全局存储,无论您想要什么).
为了摆脱堆上的对象,你明确地删除它:
delete theVectorPtr;
Run Code Online (Sandbox Code Playgroud)
你代码中的某个地方.
删除堆上的对象会终止该对象的范围,从函数返回的方式也会结束在堆栈上创建的变量的范围.