C++ 析构函数C++;:类型'***';提供给'的参数;删除';,预期指针

C++ 析构函数C++;:类型'***';提供给'的参数;删除';,预期指针,c++,destructor,C++,Destructor,我声明了一个私有变量 vector<SomeClass> theVector; 预期的指针是什么?这是因为向量不是指针,而delete'预期的是指针。“预期指针”表示delete'的操作数必须是指针 将此与 int theInt; delete theInt; 它肯定会生成一个与您得到的类似的错误。如果将对象(而不是值)定义为类成员变量,则其存储总是绑定到该类的对象实例 因此,如果在堆栈上分配了包含对象,那么当堆栈展开时,该对象和字段将消失 如果在堆上分配了包含对象,那么当整个包

我声明了一个私有变量

vector<SomeClass> theVector;

预期的指针是什么?

这是因为向量不是指针,而
delete'预期的是指针。“预期指针”表示
delete'的操作数必须是指针

将此与

int theInt;
delete theInt;
它肯定会生成一个与您得到的类似的错误。

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

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

如果在堆上分配了包含对象,那么当整个包含对象因delete而死亡时,field对象将死亡


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

如果new和delete并驾齐驱

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

int main()
{
    vector<SomeClass> theVector;

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


    delete ptrVctor;   // ptrVctor must be deleted manually
    // theVector destroyed automatically here
}
intmain()
{
向量向量;
向量*ptrVctor=新向量();
删除ptrVctor;//必须手动删除ptrVctor
//向量在这里自动销毁
}

向量的内存是为SomeClass对象分配的内存的一部分,因此如果不删除整个SomeClass对象,就无法删除它。当对象类对象被破坏时,向量的内存将自动释放。C++中的

< p>(与java不同),可以在堆栈或堆上创建对象。在堆栈上创建它的示例如下:

vector<SomeClass> theVector;
在代码的某个地方


删除堆上的对象会结束该对象的作用域,从函数返回的方法同样会结束在堆栈上创建的变量的作用域。

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

ClassA * pobj_class = new ClassA();
对于在堆栈中创建的对象,构造函数返回对象而不是指针,如下所示

ClassA obj_class();

当变量(ObjyC类)超出范围时,堆栈对象自动销毁,但堆上创建的对象将永远存在。因此,销毁堆对象C++给了删除运算符,该运算符以指针为参数,销毁指针指向的对象。< /p> < p>销毁向量中所保存的所有对象;您将执行以下操作:

theVector.resize(0);

当向量超出作用域时,这将自动发生。

此删除pTvctor会导致分配给向量的内存被释放吗?*假设在SomeClass构造函数上创建了新的,而在SomeClass析构函数上创建了删除pTvctor。上述两个示例都会取消分配所有内存。然后,new分配内存自动调用构造函数。Delete调用析构函数,然后将使用过的内存释放回系统。请注意,STL容器拥有放置在其中的所有对象。因此,当调用析构函数时,它也会销毁所有对象。是的,未分配“new”的局部变量将在超出范围时自动释放。因此,只在你新的“ed”中使用delete。实际上,你可以在“this”仍然存在时销毁向量,但这可能不是这个技能级别的人应该做的事情。=]“预期指针”是指编译器预期在给定其他内容时使用指针。这并不是说给了“预期”指针要删除。我强烈建议您阅读,它将解释指针和引用是如何工作的。当我们使用
vector theVectorPtr=new vector()时,情况会如何变化
删除VectorPTR是否也能在这里工作?@user13107,它可能工作了,但你永远不会知道:-)
new
给你一个指针,你试图将它分配给一个向量而不是向量指针。这甚至不会编译。如果你把它转换回指针,它会解决这个问题,但是向量中的类型不匹配。尝试
std::vector*v=newstd::vector()-您也可以删除它,但您可能希望确保先删除向量中的指针。
int main()
{
    vector<SomeClass> theVector;

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


    delete ptrVctor;   // ptrVctor must be deleted manually
    // theVector destroyed automatically here
}
ClassA obj_class();
theVector.resize(0);