指针的c ++内存分配过程

时间:2014-01-26 02:08:07

标签: c++ pointers memory memory-management

在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

1 个答案:

答案 0 :(得分: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;
}

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

分配内存时,最简单的策略是从列表头搜索,找到大小超过所需大小的第一个空闲块。

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

#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;
}