开发者

HELP! will this code cause memory fault after C++ object is out of scope? (STL problem)

I just came across a piece of code written by my ex-colleague few years ago. Honestly, I'm not an C++ expert, so I开发者_运维知识库 am seeking help.

The code looks like this:

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);
    }
}

My question is: after function initobjs() returns, aren't all obj instances already out of scope and automatically freed by the C++ runtime system? If they are, will any reference to contents of any of the objects added to the vector cause memory fault or unexpected result?


Your concern can be made even more local: obj ends at the bottom of the for-loop.

That said, a container makes a copy of its argument*, and does not store any reference or pointer to the "original" value.

*Hence all containers require their elements be copy-constructible and copy-assignable.


The original objects will be out of scope, but the push_back() method actually creates copies of them, because they are passed by value. So when the initobjs() function exits, the copies are still in the vector; they will be deallocated when you remove them from the vector, or when the vector itself goes out of scope.

If the vector were a vector<OBJ*>, then that would be a different matter altogether: it would mean that you'd have to manually delete every obj the moment you remove it from the vector (unless you store it elsewhere).

Note that C++ does not have any memory management built in at all, except stack-allocated variables, which are deallocated when their scope ends. RAII is the buzz-word you're looking for in case you want to enlighten yourself a bit more.


The objects vector will contain "copies" of the OBJ in the for loop. Depending on what the copy constructor of OBJ does this might yield the appropriate results or not.

I would go and check the copy constructor of OBJ for suspicious things.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜