在向量中存储对象有什么危险吗?[英] are there any dangers in storing objects in vectors?

问题描述

我记录了我的一个类的构造函数和析构函数调用,并且我
发现构造函数只调用了一次,而析构函数
单个对象被调用了 3 次.

我有一个 A 类对象的向量:
向量vector_of_As;

我把对象放在它上面:
vector_of_As.push_back(A());

vector_of_As 是本地的,所以它会自然消亡,而 As 会释放一些内存
在他们的析构函数中.可以多次调用A的析构函数
程序崩溃?

推荐答案

"r.z."<gk***@hjkjhk.pl在留言中写道
新闻:eu************@atlantis.news.tpi.pl...
>我记录了我的一个类的构造函数和析构函数调用,我
发现构造函数只调用了一次,而析构函数
为单个对象调用了 3 次.

我有一个 A 类对象的向量:
向量
我把对象放在它上面:
vector_of_As.push_back(A());

vector_of_As 是本地的,所以它会自然消亡,而 As 会释放一些
他们的析构函数中的内存.可以多次调用A的析构函数
导致程序崩溃?
还要记录您的复制和赋值构造函数.正在制作副本,
已销毁,但您没有记录他们的创作,因为您没有自定义
复制和赋值构造函数.

如果
使用默认的复制和赋值结构可能会导致问题您的构造函数或类自己分配内存.例如,
以下类可能会导致问题:

Foo类
{
公开:
Foo() { Bar = new int[100];}
~Foo() { 删除[] 酒吧;}
私人:
int* 酒吧;
};

会发生什么,当一个副本被创建时,它默认是一个浅拷贝,
因此在新副本中 Bar 被复制为指针.所以新副本
指向与原始相同的内存.当副本被销毁时,
调用析构函数,释放它的 Bar 指向的内存,但是
原文也指出了这一点.所以原来的 Bar 指针现在将是
无效,它指向的内存已被释放.

如果你的类本身不分配内存,比如 Bar 只是一个 int,那么
没事.查找"三规则".

复制时会发生什么,默认情况下是浅复制,
因此在新副本中 Bar 被复制为指针.所以新副本
指向与原始相同的内存.当副本被销毁时,
调用析构函数,释放 Bar 指向的内存
to,但原文也指向哪个.所以原件吧指针
现在将无效,它指向已被释放的内存.

如果您的类本身不分配内存,则说 Bar 只是一个 int,
然后就好了.查找"三规则".
感谢这个小讲座.我遇到了你描述的情况-
直观地,我将对象向量更改为指向对象的指针向量,
这解决了这个问题,但直到现在我才完全意识到它.


Jim Langston 写道:
"r.z."<gk***@hjkjhk.pl在留言中写道
新闻:eu************@atlantis.news.tpi.pl...
>我记录了我的一个类的构造函数和析构函数调用,我
发现构造函数只调用了一次,而析构函数
为单个对象调用了 3 次.

我有一个 A 类对象的向量:
vector
我把对象放在它上面:
vector_of_As.push_back(A());

vector_of_As 是本地的,所以它会自然消亡,而 As 在其析构函数中释放一些
内存.多次调用 A
的析构函数会导致程序崩溃吗?

还要记录您的复制和赋值构造函数.正在制作副本,
已销毁,但您没有记录他们的创作,因为您没有自定义
复制和赋值构造函数.
没有赋值构造函数这样的东西,也没有必要
记录复制赋值运算符.当然是拷贝构造函数,
和任何其他构造函数,都需要记录以维护一个
准确计数.

本文地址:https://www.itbaoku.cn/post/1050389.html