相关疑难解决方法(0)

在什么情况下我使用malloc vs new?

我在C++中看到有多种方式来分配和释放数据,我知道当你打电话给malloc你时应该打电话free,当你使用new操作员时你应该配对,delete将两者混合是错误的(例如,调用free()创建的东西)与new操作员),但我不知道何时应该使用malloc/ free何时应该在我的真实世界程序中使用new/ delete.

如果您是C++专家,请告诉我您在此方面遵循的任何经验法则或惯例.

c++ malloc memory-management new-operator

447
推荐指数
12
解决办法
26万
查看次数

如何让笔记本电脑拥有如此多的内存?

我搞乱了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太字节.笔记本电脑是否有可能拥有如此多的内存?如果那不可能,怎么解释呢?

c memory malloc

5
推荐指数
1
解决办法
103
查看次数

Malloc没有失败,但系统内存不足

我正在linux中开发一个非抢占式多线程库(在C中).要求是使用getcontext setcontextetc来创建新线程并管理它们.图书馆正常工作正常情况.

我为每个线程对象(MyThread)使用malloc,并且"malloc failed"如果malloc返回NULL,我会通过打印消息正常退出.为了测试极端条件,我运行了一个递归的fibonacci函数,它创建了子线程来计算子计算.我跑fib了越来越多的数字并且达到了限制在fib 26.

但malloc并没有抱怨.这是linux系统到达OOM并杀死进程.

问题:malloc当系统发现自己没有空间时,为什么返回成功(一个新指针)?

c linux memory multithreading

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

Malloc 不返回 NULL

我刚刚测试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)

c memory malloc out-of-memory

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

需要检查C中malloc返回的指针

假设我的代码中有以下行:

struct info *pinfo = malloc(sizeof(struct info));
Run Code Online (Sandbox Code Playgroud)

通常还有另一行代码,如下所示:

if (!pinfo)
    <handle this error>
Run Code Online (Sandbox Code Playgroud)

但这真的值得吗?特别是如果对象太小以至于生成的检查它的代码可能需要比对象本身更多的内存。

c malloc

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

如果请求超出可用物理内存(即,不使用swap),如何使malloc / calloc失败

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)

c linux malloc

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