标签: realloc

你如何在C++中'realloc'?

我怎么能用reallocC++?它似乎在语言中缺失 - 有new,delete但不是resize!

我需要它,因为当我的程序读取更多数据时,我需要重新分配缓冲区来保存它.我不认为delete旧指针和new新的更大的指针是正确的选择.

c++ realloc new-operator delete-operator

78
推荐指数
3
解决办法
7万
查看次数

malloc(0)返回什么?

什么malloc(0)回报?答案是否相同realloc(malloc(0),0)

#include<stdio.h>
#include<malloc.h>
int main()
{
        printf("%p\n", malloc(0));
        printf("%p\n", realloc(malloc(0), 0));
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

linux gcc的输出:

manav@manav-workstation:~$ gcc -Wall mal.c
manav@manav-workstation:~$ ./a.out
0x9363008
(nil)
manav@manav-workstation:~$
Run Code Online (Sandbox Code Playgroud)

输出每次都在变化malloc(0).这是标准答案吗?除了学术研究之外,为什么有人会对获得这样的指针感兴趣?

编辑:

如果malloc(0)返回虚拟指针,那么后续工作原理如何:

int main()
{
    void *ptr = malloc(0);
    printf("%p\n", realloc(ptr, 1024));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

以下代码为每次迭代输出"可能".为什么不失败?

#include<stdio.h>
#include<malloc.h>
int main()
{

        int i;
        void *ptr;
        printf("Testing using BRUTE FORCE\n");
        for (i=0; i<65000; i++)
        {
                ptr = malloc(0);
                if (ptr == realloc(ptr, 1024))
                        printf("Iteration %d: possible\n", …
Run Code Online (Sandbox Code Playgroud)

c linux malloc pointers realloc

53
推荐指数
5
解决办法
3万
查看次数

std :: vector*在增加容量时是否有*移动对象?或者,分配器可以"重新分配"吗?

一个不同的问题启发了以下思想:

在增加容量时是否std::vector<T> 必须移动所有元素?

据我所知,标准行为是底层分配器请求新大小的整个块,然后移动所有旧元素,然后销毁旧元素,然后解除分配旧内存.

在给定标准分配器接口的情况下,此行为似乎是唯一可能的正确解决方案.但我想知道,修改分配器以提供一个reallocate(std::size_t)可以返回a pair<pointer, bool>并可以映射到底层的函数是否有意义realloc()?这样做的好处是,如果操作系统实际上只能扩展分配的内存,那么根本不需要进行任何移动.布尔值表示内存是否已移动.

(std::realloc()也许不是最好的选择,因为如果我们不能扩展,我们不需要复制数据.所以实际上我们更想要类似的东西extend_or_malloc_new().编辑:也许is_pod基于特征的专业化将允许我们使用实际的realloc,包括它的按位副本.只是不一般.)

这似乎错过了机会.最坏的情况下,可以始终贯彻reallocate(size_t n)return make_pair(allocate(n), true);,所以不会有任何惩罚.

是否有任何问题导致此功能对C++不合适或不合适?

也许唯一可以利用这个的容器就是std::vector,但那时又是一个相当有用的容器.


更新:澄清一个小例子.目前resize():

pointer p = alloc.allocate(new_size);

for (size_t i = 0; i != old_size; ++i)
{
  alloc.construct(p + i, T(std::move(buf[i])))
  alloc.destroy(buf[i]);
}
for (size_t i = old_size; i < new_size; ++i)
{
  alloc.construct(p + i, T());
}

alloc.deallocate(buf); …
Run Code Online (Sandbox Code Playgroud)

c++ vector realloc allocator

51
推荐指数
2
解决办法
3107
查看次数

我应该为memcpy和realloc包含什么标题?

我正在将一个项目移植到iPhone上,它使用的realloc并且memcpy没有找到.要包含的标题是什么?

这是一个混合Objective C和C++的项目,我开始迷失方向.

在此先感谢您的帮助!

c++ header objective-c memcpy realloc

33
推荐指数
2
解决办法
7万
查看次数

为什么C++分配器中没有重新分配功能?

在C中,标准内存处理函数是malloc(),realloc()free().但是,C++ stdlib分配器只兼容其中两个:没有重新分配功能.当然,不可能完全相同realloc(),因为简单地复制内存不适合非聚合类型.但是,这个函数是否会出现问题:

bool reallocate (pointer ptr, size_type num_now, size_type num_requested);
Run Code Online (Sandbox Code Playgroud)

哪里

  • ptr先前为num_now对象分配了相同的分配器;
  • num_requested> = num_now;

和语义如下:

  • 如果分配器可以ptr从给定num_now对象的大小扩展给定的内存块num_requested,它会这样做(留下额外的内存未初始化)并返回true;
  • 否则它什么都不做并返回false.

当然,这不是很简单,但据我所知,分配器主要用于容器和容器的代码通常很复杂.

给定这样的函数,std::vector比如说,可以增长如下(伪代码):

if (allocator.reallocate (buffer, capacity, new_capacity))
  capacity = new_capacity;     // That's all we need to do
else
  ...   // Do the standard reallocation by using a different buffer,
        // copying data and freeing the current one …
Run Code Online (Sandbox Code Playgroud)

c++ memory-management realloc

33
推荐指数
3
解决办法
3829
查看次数

realloc是否会覆盖旧内容?

当我们通过重新分配内存时realloc(),先前的内容是否被覆盖?我正在尝试创建一个程序,每次我们输入数据时重新分配内存.

请通过realloc告诉我有关内存分配的信息,例如编译器依赖吗?

c realloc

33
推荐指数
4
解决办法
3万
查看次数

重新分配后,我们是否会在缓冲区中丢失数据?

我很难理解realloc是如何工作的.如果我malloc'ed缓冲区并将数据复制到该缓冲区,让我们说"AB":

 +------------+
 | A | B | \0 |
 +------------+
Run Code Online (Sandbox Code Playgroud)

然后我重新分配了缓冲区,数据中是否会丢失(甚至是单个字节)?或者只是扩展缓冲区?:

 +------------------------+
 | A | B | \0 | ? | ? | ? |
 +------------------------+
Run Code Online (Sandbox Code Playgroud)

码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void){

    char* buffer    = (char*) malloc( sizeof(char) * 3 );
    strncpy(buffer, "AB", 2);

    buffer          = (char*) realloc(buffer, sizeof(char) * 6); /* Will there be any lost here? */
    free(buffer);
    return(0);
}
Run Code Online (Sandbox Code Playgroud)

c memory-management realloc

33
推荐指数
2
解决办法
2万
查看次数

重新分配用new分配的内存是否安全?

从什么是写在这里,new分配在自由存储,同时malloc采用和这两个术语往往意味着同样的事情.

根据此处的内容,realloc可以将内存块移动到新位置.如果免费存储和堆是两个不同的内存空间,它是否意味着任何问题呢?

具体来说,我想知道它是否安全使用

int* data = new int[3];
// ...
int* mydata = (int*)realloc(data,6*sizeof(int));
Run Code Online (Sandbox Code Playgroud)

如果没有,是否还有其他方式可以安全地realloc分配内存new?我可以分配新的区域和memcpy内容,但据我所知,realloc如果可能的话可以使用相同的区域.

c++ memory-management realloc

32
推荐指数
5
解决办法
7514
查看次数

重新分配NULL值(或未定义)指针

我正在阅读realloc并对那里提到的一点感到困惑.请考虑以下代码:

#include <stdio.h>
#include <stdlib.h>

int main () {

    int* ptr = NULL;
    ptr = realloc(ptr, 10*sizeof(int));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

realloc使用最初NULL估值的内存分配内存是否有任何危险ptr?如果不是:

int* ptr = NULL;
Run Code Online (Sandbox Code Playgroud)

我有这个:

int* ptr; // no value given to ptr
Run Code Online (Sandbox Code Playgroud)

打电话realloc使用会有问题ptr吗?

c realloc undefined-behavior

30
推荐指数
2
解决办法
2万
查看次数

如果失败,realloc会释放前缓冲区吗?

如果realloc失败并且返回NULL,那么前者缓冲区是免费的还是保持原样?我没有在手册页中找到特定的信息,我很不确定该怎么做.如果释放内存,则双重释放可能存在风险.如果不是,则会发生泄漏.

realloc

28
推荐指数
2
解决办法
7538
查看次数