如果我有一个带有向量的动态分配结构,那么向量何时超出范围?在删除结构时是否会调用向量析构函数,还是在删除结构之前需要强制执行析构函数调用?
答案 0 :(得分:2)
当您动态分配结构时,您还要在其中分配所有内容。删除结构时,结构及其中的所有内容都将被销毁。编译器会注意确保调用所有析构函数。
答案 1 :(得分:0)
在您删除结构
之前,向量将保持活动状态struct Foo
{
std::vector<int> X;
}
在上述情况下,删除f也将释放向量。
Foo* f = new Foo();
delete f;
如果您的 Foo 定义如此..您需要提供析构函数。
struct Foo
{
std::vector<int> *X;
Foo()
{
X = new std::vector<int> ();
}
~Foo()
{
delete X;
}
}
您可以从两种方法中选择一种。最好的方法是使用 shared_ptr ,这样您就不用担心删除结构了
答案 2 :(得分:0)
你可能会过分思考。当您销毁任何对象时,会自动销毁所有成员对象。
struct Foo
{
Bar x;
std::vector<int> y;
};
int main()
{
Foo a;
Foo * p(new Foo);
delete p; // #2
} // #1
在#1点,a
超出范围,因此被销毁。这涉及销毁a.y
和a.x
(按此顺序),同样也会销毁#2中的*p
和p->x
/ p->y
。 Foo
对象是自动分配(如#1)还是动态分配(如#2)是无关紧要的;所有成员都得到了适当的清理。