如何在c ++中对map和string进行内存分配

时间:2015-07-17 16:03:06

标签: c++ string dictionary memory-management dynamic

我正在使用map<string,string>类型的全局声明。

  1. 如果我执行代码,是否在动态内存中创建字符串?
  2. 是否在动态内存或静态内存上创建了地图?
  3. -

    #include <iostream>
    #include <map>
    #include <string> 
    
    std::map<std::string, std::string> mymap;
    
    class myObject
    {
    public:
        myObject()
        {
            mymap["A"] = "AString";
            mymap["B"] = "BString";
            mymap["C"] = "CString";
        }
    };
    
    int main()
    {
        myObject obj1;
        std::cout << mymap["B"] << std::endl;
        return 1;
    }
    

3 个答案:

答案 0 :(得分:0)

有一个固定大小的对象代表地图本身,你已经创建了全局(与静态相同的存储类型)。这将有一些指向动态内存的指针,其中包含地图的可变大小内容。这包括动态内存中的字符串,还包括动态内存中的其他内容(依赖于实现)。

答案 1 :(得分:0)

对这个问题的正确,完整的答案可能比人们想象的更复杂。我会给你一些提示:

  • C ++标准将内存管理的细节留给了实现。你应该不要太在意这个。专注于应用程序逻辑的语义,并将内存管理留给编译器。

  • 与原始数组(或std::array)不同,std::mapstd::string(实际上,std::basic_string)是容器,其大小可在执行期间更改,所以这些类通常(但不总是,见下文)不能包含所有元素本身。它们将包含一个指向动态分配内存的指针,其中保留实际内容。 (sizeofstd::mapstd::string对象本身的大小与其当前内容无关。

  • 对于动态分配,std::mapstd::string默认使用std::allocatorstd::allocator uses placement new分配内存(不是new[])。

  • 理论上,你可以使用自定义分配器而不是默认分配器,以完全不同的方式执行任何内存分配,尽管很少这样做。

  • std::string可以使用Small-String Optimisation (SSO)实现,在这种情况下,对于小字符串,根本就会有 no 动态分配。 Visual C ++使用这种技术。

  • 写入时复制(COW)是另一种实现字符串的传统方式,它基于相同的字符串可以共享相同的动态分配内容的想法。在这种情况下,多个std::string对象中的指针将指向相同的地址。但是,这种技术在多线程场景中一直是有问题,并且C ++ 11实际上已经不允许这样做了。我刚刚提到它是为了完整。

  • 从C ++ 11开始,std::string的内容正式要求连续,即在内存中依次存储,以便您可以获取地址第一个元素,并将内容视为数组。

答案 2 :(得分:0)

实际上这张地图&lt; string,string&gt;需要移动到共享内存,所以想知道内存是如何分配的,如果我想用字符串移动地图,我需要遵循不同形式的内存管理。

如果有人知道如何实现这一目标,请告诉我。