我在C++中看到有多种方式来分配和释放数据,我知道当你打电话给malloc你时应该打电话free,当你使用new操作员时你应该配对,delete将两者混合是错误的(例如,调用free()创建的东西)与new操作员),但我不知道何时应该使用malloc/ free何时应该在我的真实世界程序中使用new/ delete.
如果您是C++专家,请告诉我您在此方面遵循的任何经验法则或惯例.
我搞乱了malloc调用,我想知道我的操作系统能给你多少内存.我试过了:
int main() {
char *String = 0;
String = malloc (100000000000000); // This is 10^14
if (String)
printf ("Alloc success !\n");
else
printf ("Alloc failed !\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
而且......它奏效了.10 ^ 14大约是18太字节.笔记本电脑是否有可能拥有如此多的内存?如果那不可能,怎么解释呢?
我正在linux中开发一个非抢占式多线程库(在C中).要求是使用getcontext setcontextetc来创建新线程并管理它们.图书馆正常工作正常情况.
我为每个线程对象(MyThread)使用malloc,并且"malloc failed"如果malloc返回NULL,我会通过打印消息正常退出.为了测试极端条件,我运行了一个递归的fibonacci函数,它创建了子线程来计算子计算.我跑fib了越来越多的数字并且达到了限制在fib 26.
但malloc并没有抱怨.这是linux系统到达OOM并杀死进程.
问题:malloc当系统发现自己没有空间时,为什么返回成功(一个新指针)?
我刚刚测试malloc了一个巨大的内存请求,但它没有返回NULL。我已经听说过这个,但是 BSD(我在 mac 上)手册页说:
返回值
如果成功,calloc()、malloc()、realloc()、reallocf()和valloc()函数返回一个指向已分配内存的指针。如果有错误,它们返回一个NULL指针并将 errno 设置为ENOMEM。
如何正确且可靠地检查返回的指针是否指向请求大小的有效块?
编辑:我刚看到这篇文章。我猜 BSD 也一样?
编辑2:代码:
typedef struct {
uint8_t red;
uint8_t green;
uint8_t blue;
} RGB_TYPE;
int main() {
RGB_TYPE *field = malloc(50000 * 50000 * sizeof(RGB_TYPE));
if (!field)
return -1;
... write to field (SEG_FAULT) ...
return 0;
}
Run Code Online (Sandbox Code Playgroud) 假设我的代码中有以下行:
struct info *pinfo = malloc(sizeof(struct info));
Run Code Online (Sandbox Code Playgroud)
通常还有另一行代码,如下所示:
if (!pinfo)
<handle this error>
Run Code Online (Sandbox Code Playgroud)
但这真的值得吗?特别是如果对象太小以至于生成的检查它的代码可能需要比对象本身更多的内存。
malloc / calloc显然使用交换空间来满足超出可用空闲内存的请求。随着磁盘使用指示灯持续亮起,这几乎使系统挂起。在发生这种情况之后,我还不确定为什么,我编写了以下5行测试程序来检查这确实是系统挂起的原因,
/* --- test how many bytes can be malloc'ed successfully --- */
#include <stdio.h>
#include <stdlib.h>
int main ( int argc, char *argv[] ) {
unsigned int nmalloc = (argc>1? atoi(argv[1]) : 10000000 ),
size = (argc>2? atoi(argv[2]) : (0) );
unsigned char *pmalloc = (size>0? calloc(nmalloc,size):malloc(nmalloc));
fprintf( stdout," %s malloc'ed %d elements of %d bytes each.\n",
(pmalloc==NULL? "UNsuccessfully" : "Successfully"),
nmalloc, (size>0?size:1) );
if ( pmalloc != NULL ) free(pmalloc);
} /* --- end-of-function main() --- …Run Code Online (Sandbox Code Playgroud)