C++ 引用变量范围问题
C++ Reference variable scope issue
我试图弄清楚为什么我的 Tag 类的析构函数被调用
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");
}
谁能给我任何想法,为什么在那里调用析构函数?没有变量在循环的作用域中定义,一个是在循环外部创建的,另一个是在函数内创建的。谢谢!
为了插入到地图中,您正在创建一个临时的,
std::pair<string, Tag>(tagName, tag)
在完整表达式结束时,它被销毁了。
你不应该担心这一点。如有必要,可以使用emplace
来避免,但是,不要担心。相反,担心函数的结果类型:
为什么需要动态分配的地图?
我很确定你没有,也就是说,这是邪恶的过早优化。
因此,我强烈建议,专注于正确性,让编译器完成优化工作,然后编写......
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
是在调用方提供的内存区域中构造的,因此不会对函数结果进行复制。
> 当loadCompoundTag()
返回时,Tag tag
会超出范围,当发生这种情况时,将调用它的析构函数。
相关文章:
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- 我在范围内未声明的错误类有问题
- 如何在cpp中使用地图显示给定日期范围内(在下面的问题中)的费率?
- 使用基于范围的循环迭代矢量时出现问题
- 示例代码中使用分隔符将 std::string 拆分为 std::vector 的范围问题
- C++ 字符串订阅超出范围的问题
- 命名空间范围问题
- 无法取消引用超出范围的向量迭代器 - 有什么问题?
- 断言失败错误,C++中的矢量下标超出范围问题
- 给定数组范围的选择排序问题
- 指针范围问题和返回类中封装的指针向量内的指针引用
- C++范围?将数组传递给函数时出现问题
- C++奇怪的问题.数据成员超出范围
- PlatformIO 的范围问题(?)
- C++. 面试. 关于返回 int* 值问题的范围
- 编程:原理与实践 使用C++ 第 4 章演练步骤 6:关于数字范围的一般问题
- 为什么BKDFHash不关心超出范围的问题?
- 访问函数中的使用声明:与范围相关的问题
- 函数返回本地变量,尽管变量不超出范围,没有编译器问题,并且代码执行
- 无法编译 - 范围问题