代码之家  ›  专栏  ›  技术社区  ›  Imagist

C和C++:释放已分配指针的一部分

  •  6
  • Imagist  · 技术社区  · 16 年前

    假设我分配了一个指针来保存4096个字节。如何释放C中的最后1024个字节?C++中的呢?相反,如果我想取消分配 第一 1024字节,其余的保留(两种语言)?如何从中间进行释放(在我看来,这需要将其拆分为两个指针,在释放区域之前和之后)。

    6 回复  |  直到 16 年前
        1
  •  12
  •   Roddy    16 年前

    不要试图猜测内存管理。它通常比你聪明;-)

    您唯一可以实现的是第一个场景“取消分配”最后1K

    char * foo = malloc(4096);
    
    foo = realloc(foo, 4096-1024);
    

    然而,即使在这种情况下,也不能保证“foo”会保持不变。您的整个4K可能会被释放,realloc()可能会将内存移到其他位置,从而使您可能持有的指向它的任何指针无效。

    新的() 分配存储。使用new()分配的内存不能是realloc(),或者至少不能以任何可移植的方式。STL向量将是C++中的一种更好的方法

        2
  •  5
  •   Stephen Veiss    16 年前

    您没有“分配给保存4096字节的指针”,您有一个指向分配给4096字节的块的指针。

    如果您的区块被分配了 malloc() , realloc()

    您不能更改邮件的起始地址 malloc 'd内存块,这正是第二个场景所要求的。也没有办法拆分一个 马洛克 d区。

    这是一个限制 马洛克 calloc / realloc / free API——而实现可能依赖于这些限制(例如,在开始地址之前保留有关分配的簿记信息,这会使移动开始地址变得困难。)

    现在 马洛克 不是唯一的分配器——您的平台或库可能提供其他分配器,或者您可以编写自己的分配器(通过 马洛克 mmap , VirtualAlloc

    对于C++,如果分配内存 std::malloc ,上述信息适用。如果你正在使用 new delete 您正在分配存储和构造对象,因此更改分配块的大小是没有意义的——C++中的对象是固定大小的。

        3
  •  3
  •   laalto    16 年前

    如果你有 n 字节 malloc realloc m M )就这样扔掉最后一个 n-m

    要从一开始就放弃,你可以 马洛克 memcpy 你想要的字节,然后 free

    new delete . 它还可以模仿第一个 案例

        4
  •  1
  •   Zed    16 年前

        5
  •  1
  •   anon anon    16 年前

    您可以使用realloc()明显地缩短内存。请注意,对于某些实现,这样的调用实际上不会起任何作用。无法释放块的第一位并保留最后一位。

    如果你发现自己需要这种功能,你应该考虑使用更复杂的数据结构。数组并不是所有编程问题的正确答案。

        6
  •  1
  •   KV Prajapati    16 年前

    http://en.wikipedia.org/wiki/New_(C%2B%2B)

    小结:与C的realloc相比,它 无法直接重新分配 或者缩小一个块的大小,一个 必须分配一个新的足够的 库提供了一个动态数组 可以在其范围内扩展或减少 向量模板。