救命!在C++对象超出范围后,此代码是否会导致内存错误?(STL问题)

cow*_*cow 3 c++ stl

几年前我刚刚遇到了我的前同事写的一段代码.老实说,我不是C++专家,所以我正在寻求帮助.

代码如下所示:

std::vector<OBJ> objects;

void initobjs()
{
    for (int i=0; i<10; i++)
    {
        OBJ obj;
        obj.type=i;
        obj.len=16;

        objects.push_back(obj);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:在函数initobjs()返回之后,是不是所有obj实例都已超出范围并被C++运行时系统自动释放?如果是,那么对添加到向量中的任何对象的内容的引用是否会导致内存错误或意外结果?

GMa*_*ckG 13

您的关注可以更加局部:obj在for循环的底部结束.

也就是说,容器生成其参数*的副本,并且不存储任何引用或指向"原始"值的指针.

*因此,所有容器都要求其元素是可复制构造和可复制分配的.

  • +1; 更明确地说,你的容器存储`OBJ`对象,而不是'OBJ&`或`OBJ*` (2认同)

tda*_*ers 7

原始对象将超出范围,但该push_back()方法实际上创建了它们的副本,因为它们是按值传递的.因此,当initobjs()函数退出时,副本仍然在向量中; 当您从向量中移除它们时,或者当向量本身超出范围时,它们将被释放.

如果向量是a vector<OBJ*>,那么这将是一个完全不同的问题:它意味着你必须在从向量中删除它时手动删除每个对象(除非你将它存储在别处).

请注意,C++根本没有内置任何内存管理,除了堆栈分配的变量,当它们的作用域结束时会被释放.RAII是您正在寻找的热门话题,以防您想要更多地启发自己.