我想说C ++将局部变量放在堆栈上。 但是让我们来看看这段代码:
class MyClass
{
private:
std::map<std::string, std::pair<int, std::string> > data;
public:
void push(std::string a, int b, std::string c)
{
std::pair<int, std::string> temp;
temp.first=45;
temp.second=c;
data[a] = temp;
}
};
在push方法调用结束时,如果此变量在本地堆栈上,则应删除临时变量。但我的计划有效,我不知道为什么。你认为data [a] = temp会复制temp吗?如果我想存储指针而不是制作副本,我该怎么办?
答案 0 :(得分:4)
data[a] = temp;
当然确实获取temp
的值副本:std::pair<int, std::string>
的赋值运算符用于此。< / p>
在C ++ 11中,有一些方法可以将东西放在std::map
上,从而避免使用这个深层副本。请参阅移动语义和安置。
答案 1 :(得分:3)
当然data[a] = temp;
会复制temp
并将其存储在data[a]
中。
由于这只是一个副本,所以没有问题。
如果将temp
的地址存储在data
内(更改其定义),则会出现问题,因为它会存储悬空指针。