【发布时间】:2013-04-14 23:26:37
【问题描述】:
如何在将映射从一个函数传递到另一个函数时正确处理内存。
我有一个函数可以返回它构建的地图。值对象是一个类 foo。 我在三个不同的位置打印 foo ,它们都给出不同的值。第一次,它给出了正确的值。第二个和第三个是垃圾。
我知道我必须在正确的位置创建 Foo 对象指针。
我想知道在哪里?
std::map<int,Foo*> function_that_returns_the_map(){
std::map<int,Foo*> myMap;
{
int v = 0;
Foo *b = new Foo();
// PRINTING FOO FIRST
std::cout<<""<<*b<<endl;
myMap.insert(std::pair<int,Foo*>(v,b))
}
// PRINTING FOO AGAIN
for(map<int,Foo*>::iterator it = myMap.begin();
it != myMap.end(); ++it)
{
std::cout << " " << *(it->second) << "\n";
}
return myMap;
}
std::map<int, Foo*> myMap;
myMap = function_that_returns_the_map();
//PRINTING FOO AGAIN.
std::map<int, Board*>::iterator it = myMap.begin();
for (it=myMap.begin(); it!=myMap.end(); ++it)
cout<<" "<<*(it->second)<<endl;
Click here 查看我的实际代码。
更新:Foo 的成员变量未使用“new”运算符分配。因此,一旦超出范围,它们就会超出范围并具有垃圾值。
【问题讨论】:
-
请发布无需修改即可演示问题的代码。您是否意识到您实际上并没有将
b放入地图中? -
也许你想要
myMap.insert(std::make_pair(v, b))。不要忘记释放内存。 -
“打印 foo”是什么意思?您不能打印课程。请显示实际打印的代码而不是 cmets。
-
@JBentley 我重载了
-
我已经编辑了我的评论,以请求代码。就像我说的,你不能打印一个类,所以说“我打印 foo”没有任何意义。