我试图弄清楚为什么调用我的标记类的析构函数
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");
}有人能告诉我为什么要在那里调用析构函数吗?这些变量都没有在循环的作用域中定义,一个在循环外部创建,另一个在函数内部创建。谢谢!
发布于 2012-09-22 10:25:27
为了插入到地图中,你正在创建一个临时的,
std::pair<string, Tag>(tagName, tag)在完整表达式的末尾,它会被销毁。
你不必担心这一点。如果有必要,可以使用emplace来避免这种情况,但是,不用担心。相反,你应该担心你的函数的结果类型:
为什么需要一个动态分配的map
我很确定你不会,也就是说,这是邪恶的过早优化。
因此,我强烈建议,将重点放在正确性上,让编译器完成其优化工作,并编写…
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是在调用者提供的内存区域中构造的,因此不会对函数结果进行复制。
发布于 2012-09-22 10:14:04
当loadCompoundTag()返回时,Tag tag超出了作用域,当发生这种情况时,将调用它的析构函数。
https://stackoverflow.com/questions/12540140
复制相似问题