"new"和"malloc"和"calloc"和其他家庭有什么区别?
(何时)除了"新"之外我还需要什么?
其中一个是否使用其他任何一个实现?
好吧,我无法理解何时以及为什么需要使用分配内存malloc.
这是我的代码:
#include <stdlib.h>
int main(int argc, const char *argv[]) {
typedef struct {
char *name;
char *sex;
int age;
} student;
//Now I can do two things
student p;
//or
student *ptr = (student *)malloc(sizeof(student));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么我可以使用时需要分配内存student p;?
典型的malloc(对于x86-64平台和Linux操作系统)是否在开始时天真地锁定互斥锁并在完成时释放它,或者是否以更精巧的方式更智能地锁定互斥锁,从而减少锁争用?如果它确实是第二种方式,它是如何做到的?
如果我分配一些内存使用malloc()是否有一种方法来标记它只读.因此,如果有人试图写入memcpy()会失败吗?
这与错误的api设计有关,用户错过了使用由GetValue()大型内存结构的一部分的方法返回的const指针 .由于我们希望避免复制大块内存,因此我们将实时指针返回到具有特定格式的结构化内存中.现在的问题是,有些用户通过直接写入这个内存来找到hack来实现工作,并避免使用SetValue()调用来进行分配并正确处理我们开发的内存二进制格式.虽然有时会破解工作,但有时它会因为用户已覆盖的控制标志的错误解释而导致内存访问冲突.
教育用户是一项任务,但我们现在要说,我们希望代码失败.
我只是想知道我们是否可以简单地防止这种情况.
为了类比,假设有人从sqlite语句中获取blob列,然后回写它.虽然在sqlite的情况下,它没有意义,但在我们的情况下这有点讨厌.
假设我有这个结构
typedef struct person{
char firstName[100], surName[51]
} PERSON;
Run Code Online (Sandbox Code Playgroud)
我正在通过malloc分配空间并用一些值填充它
PERSON *testPerson = (PERSON*) malloc(sizeof(PERSON));
strcpy(testPerson->firstName, "Jack");
strcpy(testPerson->surName, "Daniels");
Run Code Online (Sandbox Code Playgroud)
释放该结构所占用的所有内存的正确和安全的方法是什么?是"免费的(testPerson);" 够了还是我需要逐个释放每个结构的属性?
它引出了另一个问题 - 结构如何存储在内存中?我注意到一种奇怪的行为 - 当我尝试打印结构地址时,它等于它的第一个属性的地址.
printf("Structure address %d == firstName address %d", testPerson, testPerson->firstName);
Run Code Online (Sandbox Code Playgroud)
这意味着这个free(testPerson)应该等于这个free(testPerson-> firstName);
那不是我想做的.
谢谢
在C,这是非常清楚,使指向一个指向一个过去的数组的最后一个元素,并在指针算术使用它,只要你不取消对它的引用:
int a[5], *p = a+5, diff = p-a; // Well-defined
Run Code Online (Sandbox Code Playgroud)
但是,这些是UB:
p = a+6;
int b = *(a+5), diff = p-a; // Dereferencing and pointer arithmetic
Run Code Online (Sandbox Code Playgroud)
现在我有一个问题:这是否适用于动态分配的内存?假设我只是在指针算术中使用指向一个过去的指针,而不取消引用它,并且malloc()成功.
int *a = malloc(5 * sizeof(*a));
assert(a != NULL, "Memory allocation failed");
// Question:
int *p = a+5;
int diff = p-a; // Use in pointer arithmetic?
Run Code Online (Sandbox Code Playgroud) 在典型的真实世界的程序中,内存分配/释放有多大的瓶颈?任何类型的程序通常都很重要的答案是受欢迎的.malloc/free/garbage收集的正确实现是否足够快,以至于它只是少数极端情况下的瓶颈,或者大多数性能关键型软件都会从尝试保持内存分配量下降或拥有更快的malloc/free /中获益匪浅垃圾收集实施?
注意:我不是在谈论实时的东西.对性能至关重要,我的意思是吞吐量很重要,但延迟并不一定.
编辑:虽然我提到了malloc,但这个问题不是针对C/C++的.
malloc optimization performance garbage-collection memory-management
很简单的问题,我做了以下程序:
#include <stdlib.h>
int main(int argc, char ** argv)
{
void * ptr;
ptr = malloc(0);
free(ptr);
}
Run Code Online (Sandbox Code Playgroud)
它不会在我的机器上发生段错误.它是stdlib malloc的可移植行为还是免费的,还是我在寻找麻烦?
编辑:看似不可移植的是malloc返回的值.问题是关于malloc(0)+自由组合,而不是ptr的值.
我知道将动态分配的数组的长度传递给操作它们的函数是一种常见的约定:
void initializeAndFree(int* anArray, size_t length);
int main(){
size_t arrayLength = 0;
scanf("%d", &arrayLength);
int* myArray = (int*)malloc(sizeof(int)*arrayLength);
initializeAndFree(myArray, arrayLength);
}
void initializeAndFree(int* anArray, size_t length){
int i = 0;
for (i = 0; i < length; i++) {
anArray[i] = 0;
}
free(anArray);
}
Run Code Online (Sandbox Code Playgroud)
但是如果我无法从指针中获取已分配内存的长度,那么free()当我提供的内容完全相同时,"自动"知道如何解除分配?作为一名C程序员,为什么我不能进入魔术?
从哪里free()获得免费(har-har)知识?
我试图在我的机器(1 Gb RAM 160 Gb HD Windows平台)上计算出最大程度上可以使用多少内存.
我读到malloc可以分配的最大内存仅限于物理内存(堆上).
此外,当程序超过内存消耗到某个级别时,计算机将停止工作,因为其他应用程序无法获得所需的足够内存.
所以要确认一下,我在C写了一个小程序:
int main(){
int *p;
while(1){
p=(int *)malloc(4);
if(!p)break;
}
}
Run Code Online (Sandbox Code Playgroud)
我希望有一段时间内存分配失败并且循环会中断,但是我的计算机挂起,因为它是一个无限循环.
我等了大约一个小时,最后我不得不强行关闭电脑.
一些问题:
c malloc operating-system memory-management computer-architecture