C+ + 地图[=内存影响

假设您有一个未排序的实例变量映射 , 将整数映射到对象 ( 如时间对象 ) 。 如果您正在覆盖该映射 , 并且使用了标准的覆盖 , 如 map _[5]=时间。 在堆栈中 , 函数在哪里 , 当函数超出范围时 , 地图中的时间就超出范围了吗 ? 或者它与类对象是一起的 , 这样你可以稍后检查那个时间吗 ?

基本上 , 如果您在一个函数中写入实例字段映射 , 并且您正在存储稍后要访问的对象 , 那么您是否可以使用正常对象或需要使用指针 ?

我已经有一段时间没有使用 C+ + 了 , 我正在尝试重新学习这些细微差别 , 这真的让我很困惑。 谢谢 !


EN From: C++ map[]= memory ramifications

1 Comments

  1. std::mapstd::unordered_map 中所包含的对象的生存期是映射的生存期。 请记住 , 您分配给映射元素的对象与映射中包含的对象不同。


    例如 , 在这个片段中 :

    std::map<int, std::chrono::system_clock::time_point> my_map;
    auto now = std::chrono::system_clock::now();
    my_map[10] = now;
    

    实际上至少涉及两个 time_point 的对象:

    1. now
    2. my_map[10]

    my_map[10] = now 实际上做了一点:

    1. 由于 my_map 中没有关键 10 的值 , map::operator[] default-构造一个新的 time_point 对象 , 将其插入 my_map , 并返回对其的引用。
    2. 调用返回的 time_point 对象的赋值运算符函数并将引用传递到 now
    3. time_point::operator= 调整 time_point 的状态 , 以反映传入 time_point 的状态。

    存储在地图中的 time_point 对象的生存期由地图控制。 now 是一个局部变量 , 因此 , 其生存期将在声明范围的末尾结束。


    例如 , 鉴于以下类定义 :

    class Foo {
    public:
        const std::chrono::system_clock::time_point& do_a_thing(int i);
    private:
        std::map<int, std::chrono::system_clock::time_point> my_map;
    };
    

    do_a_thing 的下列定义无效 :

    const std::chrono::system_clock::time_point& do_a_thing(int i) {
        auto now = std::chrono::system_clock::now();
        my_map[i] = now;
        return now;  // whoops, returning a reference to a function local
    }
    

    以下各项有效 :

    const std::chrono::system_clock::time_point& do_a_thing(int i) {
        auto now = std::chrono::system_clock::now();
        my_map[i] = now;
        return my_map[i]; // OK, the lifetime of my_map[i] is the same as my_map
    }
    

More articles:

  • 在地图中存储大量字符串的最有效内存方法是什么 ?
  • 为什么内存不放在上面和地图上 ?
  • Windows 中是否有内存虚拟文件 API?
  • Python 内存问题
  • 为什么 ( Sun ) JVM 有一个固定的内存使用上限 ( - Xmx ) ?
  • C动态内存分配
  • SQLite 内存模式支持本地持久性?
  • 在 PHP 中, 有什么方法可以动态地扩展内存限制吗?
  • 一个堆栈对象在创建时分配了多少内存 ?
  • 免费缓冲区大小 - 我有很多内存所以为什么不让它变大呢 ?
  • 识别内存映射文件
  • . NET 和 Bitmap 在没有内存时不会自动由 GC 处理
  • 释放变量 , 但应用程序仍在泄漏内存和崩溃
  • 我的结构阵列内存不足, 我该如何修复?
  • MySQL 内存存储引擎
  • 如何在 PHP 中释放内存?
  • 为什么这个 Java / Groovy 代码会导致堆内存异常 ?
  • 读取内存映射文件
  • C - 储存内存分配
  • 金属中的 ThreadGroup 内存问题
  • 在 Java 中使用".printf(.)"在内存中打印该值
  • PHP 加载大型 csv 文件 - 内存问题
  • 我应该担心内存泄漏吗 ?
  • 基本 C 矩阵分割内存分配
  • 通过内存迭代到读取值
  • Java 8 奇数时间 / 内存问题
  • 并行 Python-C++ 程序冻结 (内存?)
  • 窗口中的 Python 程序内存
  • 为什么基元与对象数组的内存使用不同
  • 跟踪 Ruby 1.9 中的内存泄漏