标签: malloc

Malloc错误:释放对象的校验和不正确

我正在为一项任务实施尾部.我有它正常工作,但我似乎在随机时间免费获得错误.

我无法看到,追踪到一个模式或除了它之外的任何东西是一致的.

例如,如果我将我的程序称为"tail -24 test.in",我将在多次运行时在同一行中得到错误的校验和错误.但是,使用不同的文件,甚至不同的行数打印回来,我会回来没有错误.

关于如何追踪问题的任何想法,我一直试图调试它几个小时无济于事.

这是违规代码:

lines被定义为char**,并且malloc为:

lines = (char**) malloc(nlines * sizeof(char *));

void insert_line(char *s, int len){

  printf("\t\tLine Number: %d Putting a %d line into slot: %d\n",processed,len,slot);
  if(processed > numlines -1){//clean up
    free(*(lines+slot));
    *(lines + slot) = NULL;
  }
  *(lines + slot) = (char *) malloc(len * sizeof(char));
  if(*(lines + slot) == NULL) exit(EXIT_FAILURE);
  strcpy(*(lines+slot),s);
  slot = ++processed % numlines;
}
Run Code Online (Sandbox Code Playgroud)

c debugging malloc pointers

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

移动指针后C中的内存泄漏问题(究竟是什么解除分配?)

我意识到下面的代码示例是你永远不应该做的事情.我的问题只是一个有趣的问题.如果你分配一块内存,然后移动指针(一个禁忌),当你释放内存时,释放的块的大小是多少,内存在哪里?这是人为的代码片段:

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

int main(void) {
    char* s = malloc(1024);
    strcpy(s, "Some string");
    // Advance the pointer...
    s += 5;
    // Prints "string"
    printf("%s\n", s);
    /*
     * What exactly are the beginning and end points of the memory 
     * block now being deallocated?
     */
    free(s);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这就是我认为我发生的事情.被释放的内存块以保存字符串"s"的字节开头.持有"Some"的5个字节现在丢失了.

我想知道的是:5个字节在内存中的位置是否紧跟原始1024字节的末尾,也就是说,它们是否只是单独存在?

任何人都知道编译器的作用是什么?这是不确定的?

谢谢.

c malloc memory-leaks memory-management

9
推荐指数
3
解决办法
2221
查看次数

包装malloc - C.

我是C的初学者.在阅读git的源代码时,我发现了这个包装函数malloc.

void *xmalloc(size_t size)
{
    void *ret = malloc(size);
    if (!ret && !size)
        ret = malloc(1);
    if (!ret) {
        release_pack_memory(size, -1);
        ret = malloc(size);
        if (!ret && !size)
            ret = malloc(1);
        if (!ret)
            die("Out of memory, malloc failed");
    }
#ifdef XMALLOC_POISON
    memset(ret, 0xA5, size);
#endif
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

问题

  1. 我不明白他们为什么要用malloc(1)
  2. 做什么release_pack_memory和我在整个源代码中找不到这个函数实现.
  3. 这有什么#ifdef XMALLOC_POISON memset(ret, 0xA5, size);作用?

我打算在我的项目中重用这个功能.这是一个很好的包装malloc

任何帮助都会很棒.

c malloc memory-management

9
推荐指数
1
解决办法
1887
查看次数

多线程C应用程序应如何处理失败的malloc()?

我正在处理的应用程序的一部分是一个简单的基于pthread的服务器,它通过TCP/IP套接字进行通信.我在C中编写它是因为它将在内存受限的环境中运行.我的问题是:如果其中一个线程遇到返回NULL的malloc(),程序应该怎么做?到目前为止我想出的可能性:

  1. 没有特别处理.让malloc()返回NULL并让它被解除引用,以便整个事件发生段错误.
  2. 通过调用abort()或exit(-1)立即退出失败的malloc().假设环境将清理一切.
  3. 跳出主事件循环并尝试pthread_join()所有线程,然后关闭.

第一种选择显然是最简单的,但似乎非常错误.第二个也似乎错了,因为我不确切知道会发生什么.第三个选项,似乎除了两个问题诱人的:首先,所有的线程不需要在正常情况下和第二连接回主线程,以完成该线程执行,其余大部分线程必须调用malloc( )无论如何.

我该怎么办?

c malloc pthreads

9
推荐指数
1
解决办法
1597
查看次数

结构中的数组和结构的Malloc

如何将malloc放在另一个结构体内?

我还想在结构中malloc一个项目数组,然后在需要时重新分配这个数组,这是如何正确完成的?

你能举个例子来说明一个结构,然后是上面的结构.

我有点不确定事情的顺序.

结构中的数组是否会被释放,然后结构本身,结构在创建时是否必须被malloced,然后它的字段被malloced /声明等?

c malloc struct realloc

9
推荐指数
1
解决办法
3万
查看次数

如何在C中进行自动内存管理?

在C内存分配/释放中由malloc和完成free.

在C++内存分配/释放由new和完成delete.

C++中有一些用于自动内存管理的解决方案,例如:

  • 智能指针.
  • RAII(资源获取初始化)
  • 引用计数和循环引用
  • ...

但是如何在C中进行自动内存管理?

C中的AUTOMATIC内存管理有什么解决方案吗?

对于C,有没有任何指导或类似的指导?

当我忘记free一块记忆时我想要:

  • 我的代码没有编译

- 要么 -

  • 内存自动解除分配

然后我说:哦,C比C++,Java和C#更好.:-)

c malloc free memory-management

9
推荐指数
1
解决办法
2874
查看次数

使用calloc()而不是malloc()和memset()有什么好处吗?

我想知道是否calloc()优于a malloc后跟a memset.后者似乎是分配和初始化内存的最常用方式.

一个GitHub的代码搜索变成了许多calloc测试和实现,但在页面的第一个数字代码没有实际使用calloc.

有谁知道任何使用或推荐使用的项目/组织calloc以及推荐它的情况?

从下面的评论和答案中,以下是迄今为止出现的一些想法:

  • calloc(n, size) 可以防止溢出 malloc(n * size)

  • 结合mallocmemset使calloc有机会请求已知已经归零的页面.

  • calloc的一个缺点是组合的步骤可能会排除malloc周围的其他包装器.

c malloc memory-management calloc dynamic-allocation

9
推荐指数
1
解决办法
930
查看次数

由于内存耗尽而从NULL == malloc()恢复的策略

阅读Martin Sustrick撰写的有关在C++中防止"未定义行为"的问题的博客,特别是由于内存耗尽而导致malloc()失败的问题,我被提醒了很多次,我很沮丧地知道是什么在这种情况下做.

对于虚拟系统来说,这种情况很少见,但是在嵌入式平台上,或者在击中虚拟系统时伴随着性能下降等同于失败的情况,正如Martin对ZeroMQ的情况一样,我决定找到一个可行的解决方案,并且做到了.

我想向StackOverflow的读者询问他们是否尝试过这种方法,以及他们使用它的经验.

解决方案是在程序开始时调用malloc()从堆中分配一块备用内存,然后使用该备用内存池来避免内存耗尽.这个想法是为了防止投降有利于有序撤退(我正在阅读Kesselring昨晚对意大利的辩护的说法),其中错误信息和IP套接字等工作时间足够长(希望)至少告诉用户发生了什么.

#define SPARE_MEM_SIZE (1<<20)  // reserve a megabyte
static void *gSpareMem;

// ------------------------------------------------------------------------------------------------
void *tenacious_malloc(int requested_allocation_size)   {
    static int remaining_spare_size = 0;    // SPARE_MEM_SIZE;
    char err_msg[512];
    void *rtn = NULL;

    // attempt to re-establish the full size of spare memory, if it needs it
    if (SPARE_MEM_SIZE != remaining_spare_size) {
        if(NULL != (gSpareMem = realloc(gSpareMem, SPARE_MEM_SIZE))) {
            remaining_spare_size = SPARE_MEM_SIZE;
            // "touch" the memory so O/S will allocate physical …
Run Code Online (Sandbox Code Playgroud)

c memory malloc memory-management

9
推荐指数
1
解决办法
950
查看次数

"语义问题:隐式声明库函数'malloc',类型为'void*(unsigned long)'"

我有一段代码,我试图在括号内抓取一个表达式,然后使用它.在下面的代码开始的时候,我正在迭代字符数组,并且pcc是指向当前字符的指针,该字符已被确定为a '('.我的目标是将paranthetical表达式放在一个字符数组中pe.

            int nnrp = 1; /* Net number of right parantheses */
            char * pbpe = pcc; /* Pointer to the beginning paranthetical expression */
            for (++pcc; *pcc!= '\0' && nnrp != 0; ++pcc)
            {
                if (*pcc == '(')
                {
                    ++nnrp;
                }
                else if (*pcc == ')')
                {
                    --nnrp;
                }
                else if (*pcc == '\0')
                {
                    sprintf(err, "Unbalanced paranthesis");
                    return -1;
                }
            }
            /* If we're here, *pcc is the closing paranathesis of *pbpe …
Run Code Online (Sandbox Code Playgroud)

c malloc pointers character-arrays

9
推荐指数
1
解决办法
1万
查看次数

如何在函数结束后"释放"变量?

在C中执行函数(通过malloc)后释放已分配内存的正确方法是什么?我需要分配内存,以某种方式使用它并将其返回,而不是我必须释放它.

char* someFunction(char* a, char* b) {
   char* result = (char*)malloc(la + 2 * sizeof(char));
   ...
   return result;
}
Run Code Online (Sandbox Code Playgroud)

c malloc free pointers

9
推荐指数
2
解决办法
4827
查看次数