标签: malloc

malloc:***错误:释放对象的校验和不正确 - 对象可能在被释放后被修改

我的iOS应用程序存在很大问题:它有时会在没有详细调试错误的情况下崩溃.堆栈跟踪为空.这些是堆栈跟踪中仅有的两行:

  1. UIApplicationMain中的崩溃开始于"符号存根: - [_ UIHostedTextServiceSession dismissTextServiceAnimated:]".
  2. 并报告"libsystem_c.dylib`malloc_error_break".

com.apple.main-thread.

Xcode调试器上的错误(连接设备):

malloc: *** error for object 0x208a7614: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
Run Code Online (Sandbox Code Playgroud)

我在malloc_error_break中使用libsystem_c.dylib设置了断点,没有来自调试器的任何反馈.我不知道要解决这个问题.

c crash malloc objective-c ios

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

为malloc创建一个包装函数,在C中创建free

我试图创建一个包装函数free,并malloc用C来帮助通知我的内存泄漏.有谁知道什么时候我打电话怎么这么声明这些功能malloc()free()它会调用我的自定义功能,而不是标准的lib功能?

c malloc memory-leaks memory-management

38
推荐指数
6
解决办法
4万
查看次数

内存分配的时间复杂度

使用new,malloc等动态内存分配的时间复杂度是多少?我对内存分配器的实现方式知之甚少,但我认为答案是它取决于实现.因此,请回答一些更常见的案例/实施.

编辑:我依稀记得在最坏的情况下听到堆分配是无限的,但我真的对平均/典型情况感兴趣.

malloc optimization memory-management time-complexity

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

C:正确释放多维数组的内存

假设您有以下用于初始化多维数组的ANSI C代码:

int main()
{
      int i, m = 5, n = 20;
      int **a = malloc(m * sizeof(int *));

      //Initialize the arrays
      for (i = 0; i < m; i++) { 
          a[i]=malloc(n * sizeof(int));
      }

      //...do something with arrays

      //How do I free the **a ?

      return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用后**a,如何正确地从内存中释放它?


[更新](解决方案)

感谢Tim(以及其他人)的回答,我现在可以做这样的功能来从我的多维数组中释放内存:

void freeArray(int **a, int m) {
    int i;
    for (i = 0; i < m; ++i) {
        free(a[i]);
    }
    free(a);
}
Run Code Online (Sandbox Code Playgroud)

c malloc free memory-leaks memory-management

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

c中的malloc vs mmap

我建了两个程序,一个使用malloc,另一个使用mmap.使用的执行时间mmap远远少于使用malloc.

我知道,例如,当您使用时,mmap请避免对系统进行读/写调用.并且内存访问较少.

但在使用时,还有没有其他原因的优势mmap超过malloc

非常感谢

c malloc mmap

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

malloc&placement new vs. new

过去几天我一直在研究这个问题,到目前为止,除了教条论点或对传统的诉求之外,我还没有真正找到任何令人信服的东西(即"它是C++方式!").

如果我正在创建一个对象数组,使用时有什么令人信服的理由(除了易用性):

#define MY_ARRAY_SIZE 10

//  ...

my_object * my_array=new my_object [MY_ARRAY_SIZE];

for (int i=0;i<MY_ARRAY_SIZE;++i) my_array[i]=my_object(i);
Run Code Online (Sandbox Code Playgroud)

过度

#define MEMORY_ERROR -1
#define MY_ARRAY_SIZE 10

//  ...

my_object * my_array=(my_object *)malloc(sizeof(my_object)*MY_ARRAY_SIZE);
if (my_object==NULL) throw MEMORY_ERROR;

for (int i=0;i<MY_ARRAY_SIZE;++i) new (my_array+i) my_object (i);
Run Code Online (Sandbox Code Playgroud)

据我所知,后者比前者更有效(因为你没有不必要地将内存初始化为一些非随机值/调用默认构造函数),唯一的区别就在于你清理了一个:

delete [] my_array;
Run Code Online (Sandbox Code Playgroud)

另一个你清理:

for (int i=0;i<MY_ARRAY_SIZE;++i) my_array[i].~T();

free(my_array);
Run Code Online (Sandbox Code Playgroud)

我出于一个令人信服的理由.上诉的事实,这是C++(不是C),因此mallocfree不应使用不-据我可以告诉- 引人注目的一样,因为它是教条主义.是否有一些我缺少的东西new []优于malloc

我的意思是,就我所知,你根本不能使用new []- 根本没有 - 创建一个没有默认的无参数构造函数的数组,而这个malloc方法可以这样使用.

c++ malloc placement-new new-operator

37
推荐指数
6
解决办法
5973
查看次数

在GCC中对齐malloc()?

GCC或glibc中是否有任何标准化函数在对齐指针处分配内存块?像MSVC中的_align_malloc()一样?

c malloc gcc

36
推荐指数
5
解决办法
7万
查看次数

使用malloc动态创建字符串数组

我正在尝试使用C创建一个字符串数组malloc.数组将保留的字符串数可以在运行时更改,但字符串的长度将始终保持一致.

我试过这个(见下文),但是遇到了麻烦,我们非常感谢任何正确方向的提示!

#define ID_LEN 5
char *orderedIds;
int i;
int variableNumberOfElements = 5; /* Hard coded here */

orderedIds = malloc(variableNumberOfElements * (ID_LEN + 1));
Run Code Online (Sandbox Code Playgroud)

最终我希望能够使用数组来执行此操作:

strcpy(orderedIds[0], string1);
strcpy(orderedIds[1], string2);
/* etc */
Run Code Online (Sandbox Code Playgroud)

c arrays malloc

36
推荐指数
3
解决办法
12万
查看次数

用于C/C++的多线程内存分配器

我目前有大量的多线程服务器应用程序,我正在四处寻找一个好的多线程内存分配器.

到目前为止,我被撕裂了:

  • 太阳的呃
  • 谷歌的tcmalloc
  • 英特尔的线程构建块分配器
  • Emery Berger的囤积

从我发现的囤积可能是最快的,但我在今天之前没有听说过,所以我怀疑它是否真的像它看起来那么好.任何人都有尝试这些分配器的个人经验?

c c++ memory malloc allocation

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

sprintf()具有自动内存分配?

我正在寻找一个sprintf() - 类似于自动分配所需内存的函数的实现.所以我想说

char* my_str = dynamic_sprintf( "Hello %s, this is a %.*s nice %05d string", a, b, c, d );
Run Code Online (Sandbox Code Playgroud)

和my_str检索保存此sprintf()结果的已分配内存的地址.

在另一个论坛中,我读到这可以像这样解决:

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

int main()
{
    char*   ret;
    char*   a = "Hello";
    char*   b = "World";
    int     c = 123;

    int     numbytes;

    numbytes = sprintf( (char*)NULL, "%s %d %s!", a, c, b );
    printf( "numbytes = %d", numbytes );

    ret = (char*)malloc( ( numbytes + 1 ) * sizeof( char ) );
    sprintf( ret, …
Run Code Online (Sandbox Code Playgroud)

c malloc printf

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