C++ 如何在C++;?
如果我们创建一个C++ 如何在C++;?,c++,pointers,initialization,destructor,stdmap,C++,Pointers,Initialization,Destructor,Stdmap,如果我们创建一个映射,我们可以清除它,但它仍然保留在内存中,对吗?例如 #include <map> using namespace std; int main(){ map<int,int> myMap; myMap[1] = 2; myMap.clear(); return 0; } 取消注释myMap[1]=2行以错误结束: alvas@ubi:~$g++test.cpp test.cpp:在函数“int main()”中: test
映射
,我们可以清除它,但它仍然保留在内存中,对吗?例如
#include <map>
using namespace std;
int main(){
map<int,int> myMap;
myMap[1] = 2;
myMap.clear();
return 0;
}
取消注释myMap[1]=2代码>行以错误结束:
alvas@ubi:~$g++test.cpp
test.cpp:在函数“int main()”中:
test.cpp:8:14:错误:与“operator=”不匹配(操作数类型为“std::map”和“int”)
myMap[1]=2;
^
在/usr/include/c++/5/map:61:0中包含的文件中,
来自测试。cpp:2:
/usr/include/c++/5/bits/stl_-map.h:296:7:注:候选者:std::map&std::map::operator=(const std::map&)[with _Key=int;_Tp=int;_Compare=std::less;_Alloc=std::allocator>]
运算符=(常量映射和x)
^
/usr/include/c++/5/bits/stl_-map.h:296:7:注意:参数1从'int'到'const-std::map&'的转换未知
如何在C++中破坏<代码>映射< /代码>?它是“可破坏的”吗
另外,如何初始化/填充映射
指针的值
如何在C++中破坏一个映射?< /P>
当您将它声明为对象时(第一种情况),当它超出范围时,它将被销毁
当声明为指针时,delete
关键字在使用new
时起作用。如果使用智能指针,则无需显式调用delete
如何初始化/填充映射指针的值
使用如下方法:
#include <map>
using namespace std;
int main(){
map<int,int> *myMap = new map<int,int>;
myMap->insert(make_pair<int, int>(1, 2));
delete myMap;
return 0;
}
#包括
使用名称空间std;
int main(){
map*myMap=新地图;
myMap->insert(生成配对(1,2));
删除myMap;
返回0;
}
或者,正如@Michael所建议的,您可以使用(*myMap)[1]=2代码>但我更喜欢使用API
注意:正如注释中所指出的,对于std::map
而言,和insert()
在行为上并不相似。只是在这个最小的示例中,它们没有反映任何差异。有几种方法可以释放std::map
正在使用的内存(达到其初始最小值),而无需使用指针
首先是惯用的clear and minimize(交换),即创建一个空的临时映射,并将其内容与工作映射交换:
std::map<int,int>().swap(myMap); // memory reset to minimum
如果必须使用指针(最好避免),则需要使用*
取消对指针的引用,如下所示:
(*myMap)[key] = value;
(*myMap)[1]=2如果使用new
,code>会起作用。其余部分在CinCout答案中,如下所示:名称原因int*i=new int(0);i+=5;删除i
不会将5添加到int
“如果我们创建映射
,我们可以清除它,但它仍保留在内存中,对吗?”映射管理对象本身会这样做(可能是一个或二十多个字节,这取决于您是编译32位还是64位应用程序,以及map
实现是否添加了数据以支持调试)但是地图
用来存储的数据元素的内存将被应用程序释放以供重用。总之,在地图
上进行清除
是非常不值得的。这与向量
形成了鲜明对比,后者倾向于保留存储元素的内存。走第一条路。当你当你清除一张地图时,它的内容就消失了。它占用的存储空间不会比指向它的指针多(好吧,也许只是多一点)。不要不必要地使您的代码复杂化。您有15K代表。您应该知道一次只问一个问题。^在这种情况下,这会产生什么影响?如果忽略关键细节,您的回答表明它们是等效的,而不是等效的。
int func()
{
{ // <- start an internal scope for the map
std::map<int,int> myMap;
// use the map
} // <- let the map go out of scope when done using it
// carry on without the map
}
(*myMap)[key] = value;