【问题标题】:c++ memory allocation procedure for pointersc++指针的内存分配过程
【发布时间】:2014-01-26 02:08:06
【问题描述】:

在 MSVC++ 中,首先我创建了一个 vil_image_view 容器(im_1)并通过给出大小(行和列)来分配内存,然后我为该指针分配了一个 NULL 值,在这两个步骤之后我创建了另一个图像容器(im_2 ) 并执行相同的程序来分配内存,我注意到两个容器的内存地址是相同的。这是完全随机的吗?或者分配和释放是如何发生的?

vil_image_view 是来自 vxl 库的图像容器,它是一个共享指针,当引用计数器变为零时,该对象将被自动删除

vil_image_view<float> im_1;

im_1.set_size(n,m);  //0x05773ff0

im_1 = NULL;        //0x00000000

vil_image_view<float> im_2;

im_2.set_size(n,m);  //0x05773ff0

【问题讨论】:

  • 如果你malloc 一个内存块,然后free 它,然后malloc 再次具有相同大小,很有可能你会得到相同的块 - 它位于free list 的顶部

标签: c++ pointers memory memory-management


【解决方案1】:

以下代码返回VC编译并在windows上运行的相同地址。

#include <iostream>

using namespace std;

int main()
{
    int *i = new int[100];
    std::cout << i << std::endl;
    delete [] i;

    int *j = new int[100];
    std::cout << j << std::endl;
    delete [] j;

    return 0;
}

不同的系统可能有不同的内存分配和释放策略。但通常记忆是由链表维护的。一块空闲内存(带有标题)将指向下一个空闲内存。已经分配的将被跳过。释放内存后,可能需要与现有的空闲块合并以形成更大的块。

在分配内存时,最简单的策略是从链表头开始搜索,找到第一个大于所需大小的空闲块。

以下代码很可能不会返回相同的地址。

#include <iostream>

using namespace std;

int main()
{
    int *i = new int[100];
    std::cout << i << std::endl;
    delete [] i;

    int *j = new int[10000];
    std::cout << j << std::endl;
    delete [] j;

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 2021-11-29
    • 2018-08-11
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多