我的iOS应用程序存在很大问题:它有时会在没有详细调试错误的情况下崩溃.堆栈跟踪为空.这些是堆栈跟踪中仅有的两行:
在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设置了断点,没有来自调试器的任何反馈.我不知道要解决这个问题.
我试图创建一个包装函数free,并malloc用C来帮助通知我的内存泄漏.有谁知道什么时候我打电话怎么这么声明这些功能malloc()和free()它会调用我的自定义功能,而不是标准的lib功能?
使用new,malloc等动态内存分配的时间复杂度是多少?我对内存分配器的实现方式知之甚少,但我认为答案是它取决于实现.因此,请回答一些更常见的案例/实施.
编辑:我依稀记得在最坏的情况下听到堆分配是无限的,但我真的对平均/典型情况感兴趣.
假设您有以下用于初始化多维数组的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) 我建了两个程序,一个使用malloc,另一个使用mmap.使用的执行时间mmap远远少于使用malloc.
我知道,例如,当您使用时,mmap请避免对系统进行读/写调用.并且内存访问较少.
但在使用时,还有没有其他原因的优势mmap超过malloc?
非常感谢
过去几天我一直在研究这个问题,到目前为止,除了教条论点或对传统的诉求之外,我还没有真正找到任何令人信服的东西(即"它是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),因此malloc而free不应使用不-据我可以告诉- 引人注目的一样,因为它是教条主义.是否有一些我缺少的东西new []优于malloc?
我的意思是,就我所知,你根本不能使用new []- 根本没有 - 创建一个没有默认的无参数构造函数的数组,而这个malloc方法可以这样使用.
GCC或glibc中是否有任何标准化函数在对齐指针处分配内存块?像MSVC中的_align_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) 我目前有大量的多线程服务器应用程序,我正在四处寻找一个好的多线程内存分配器.
到目前为止,我被撕裂了:
从我发现的囤积可能是最快的,但我在今天之前没有听说过,所以我怀疑它是否真的像它看起来那么好.任何人都有尝试这些分配器的个人经验?
我正在寻找一个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) malloc ×10
c ×8
c++ ×2
memory-leaks ×2
allocation ×1
arrays ×1
crash ×1
free ×1
gcc ×1
ios ×1
memory ×1
mmap ×1
new-operator ×1
objective-c ×1
optimization ×1
printf ×1