首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++引用变量范围问题

C++引用变量范围问题
EN

Stack Overflow用户
提问于 2012-09-22 10:11:55
回答 2查看 367关注 0票数 1

我试图弄清楚为什么调用我的标记类的析构函数

代码语言:javascript
复制
map<string, Tag>* TestLoader::loadCompoundTag()
{
    map<string, Tag>* compound = new map<string, Tag>();
    //Create locally scoped variable
    Tag tag;
    string tagName;
    do 
    {
        loadTag(tag, tagName);
            //Copies variable into map
        compound->insert(std::pair<string, Tag>(tagName, tag));
    //Tag destructor is called before debugger breaks on this line
    } while (tag.type != TAG_End);

    return compound;
}

void TestLoader::loadTag( Tag& tag, string& name )
{
    tag.i = 0;
    name = string("Test");
}

有人能告诉我为什么要在那里调用析构函数吗?这些变量都没有在循环的作用域中定义,一个在循环外部创建,另一个在函数内部创建。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-22 10:25:27

为了插入到地图中,你正在创建一个临时的,

代码语言:javascript
复制
std::pair<string, Tag>(tagName, tag)

在完整表达式的末尾,它会被销毁。

你不必担心这一点。如果有必要,可以使用emplace来避免这种情况,但是,不用担心。相反,你应该担心你的函数的结果类型:

为什么需要一个动态分配的map

我很确定你不会,也就是说,这是邪恶的过早优化。

因此,我强烈建议,将重点放在正确性上,让编译器完成其优化工作,并编写…

代码语言:javascript
复制
map<string, Tag> TestLoader::loadCompoundTag() const
{
    map<string, Tag> result;
    do 
    {
        Tag tag;
        string tagName;
        loadTag(tag, tagName);
        result->emplace( std::pair<string, Tag>( tagName, tag) );
    } while (tag.type != Tag::end);
    return result;
}

很可能你甚至不需要要求编译器进行优化,就可以在这里获得返回值优化,这意味着,显然是本地的result是在调用者提供的内存区域中构造的,因此不会对函数结果进行复制。

票数 2
EN

Stack Overflow用户

发布于 2012-09-22 10:14:04

loadCompoundTag()返回时,Tag tag超出了作用域,当发生这种情况时,将调用它的析构函数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12540140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档