malloc是确定性的吗?说如果我有一个分叉进程,也就是另一个进程的副本,并且在某些时候它们都调用了malloc函数.两个进程中分配的地址是否相同?假设其他执行部分也是确定性的.
注意:这里,我只讨论虚拟内存,而不是物理内存.
我正在编写C代码,我想堆分配512*256字节.为了方便起见,我希望能够使用语法数组[a] [b]访问元素; 没有算术来找到正确的索引.
我在网上看到的每个教程都告诉我要创建一个指针数组,指向我在数组中想要的行数组.这意味着每个子数组都需要单独进行malloc和free.我感兴趣的,只需要调用一次malloc和一个呼叫免费的解决方案.(因此,所有的元素是连续的),我认为这是可能的,因为我不会构建一个交错的数组.
如果有人可以分享声明这样一个数组的语法,我将不胜感激.
我已经投入了大量的C代码行来清理标签/条件失败的内存分配(由alloc系列返回指示NULL).我被告知这是一个很好的做法,因此,在内存故障时,可以标记适当的错误状态,并且调用者可以执行"优雅的内存清理"并重试.我现在对这个我希望清理的哲学有些怀疑.
我想这可能是一个主叫方可能会取消分配过多的缓冲空间或剥夺他们的数据关系的对象,但我发现来电者很少有能力(或者是抽象的适当的水平),这样做.此外,从被叫函数提前返回没有副作用通常是非常重要的.
我刚刚发现了Linux OOM杀手,这似乎使我的主要开发平台上的这些努力毫无意义.
默认情况下,Linux遵循乐观的内存分配策略.这意味着当malloc()返回非NULL时,无法保证内存确实可用.这是一个非常糟糕的错误.如果事实证明系统内存不足,臭名昭着的OOM杀手就会杀死一个或多个进程.
我认为可能还有其他平台遵循相同的原则.有没有务实的东西使得检查OOM条件值得?
我很好奇,如果两个线程同时请求分配内存,是否存在内存分配锁定.我正在使用OpenMP来执行多线程,C++代码.
操作系统:主要是Linux,但也想了解Windows和Mac.
我有一个分配大量内存的应用程序,我正在考虑使用比malloc更好的内存分配机制.
我的主要选择是:jemalloc和tcmalloc.使用它们中的任何一个是否有任何好处?
在http://locklessinc.com/benchmarks.shtml中 ,一些机制(包括作者的专有机制 - 无锁)之间有一个很好的比较,它提到了每个机制的优点和缺点.
鉴于这两种机制都是积极的并且不断改进.有没有人对这两者的相对表现有任何见解或经验?
关于C中的多维数组,我已经看过几十个关于"我的代码有什么问题"的问题.出于某种原因,人们似乎无法理解这里发生的事情,所以我决定回答这个问题作为对其他人的参考:
如何在C中正确设置,访问和释放多维数组?
如果其他人有有用的建议,请随时发布!
为了理解C编程语言中free的用法,我尝试在Ubuntu上运行此代码,但是在运行EXE文件时,我收到了SIGABRT错误.为什么程序没有正常退出?
#include<stdio.h>
#include<stdlib.h>
int main()
{
int ret;
int *ptr;
ptr = (int *)malloc(sizeof(int)*10);
free(ptr);
ptr = &ret;
free(ptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我理解在C++ 中使用new反对的好处malloc.但是,对于特定的情况下,如原始数据类型(非阵列) - int,float等等,是它更快地使用malloc比new?
虽然,new如果我们分配一个数组以便我们可以使用,它总是建议甚至用于原语delete[].
但对于非数组分配,我认为不会有任何构造函数调用int?因为,new运算符分配内存,检查它是否已分配,然后调用构造函数.但只为元非阵列堆分配,是它更好地使用malloc比new?
请指教.
在 C 中,如果我们只访问分配内存中的元素,那么向数组指针分配内存不足是“合法的”吗?或者这会调用未定义的行为吗?
int (*foo)[ 10 ]; //Pointer to array of 10 ints
foo = malloc( sizeof( int ) * 5 ); //Under-allocation!
//Only enough memory for 5 ints
//Now we only ever access (*foo)[ 0 - 4 ]
Run Code Online (Sandbox Code Playgroud)
如果这本身不是未定义的行为,那么访问另一个不相关的对象(其内存地址恰好落在数组未分配部分的地址空间内)是否会导致严格别名冲突?
C++有几个功能来获取动态存储,其中大部分功能在某些基本方面有所不同.OS通常会添加几个.
由于它们的便携性和相似性,其中两个特别感兴趣:malloc和::operator new.
全局void* operator new(size_t, ::std::nothrow&)和void* malloc(size_t)?之间是否有任何差异(标准和实施)?
由于我所说的似乎有些混乱,请考虑以下两个调用:
void* p = ::std::malloc(10);
void* q = ::operator new(10, ::std::nothrow);
Run Code Online (Sandbox Code Playgroud)
明显和微不足道的区别在于如何释放内存:
::std::free(p);
::operator delete(q);
Run Code Online (Sandbox Code Playgroud)
注意:这个问题不重复,例如new/delete和malloc/free有什么区别?因为它谈到使用实际上不执行任何ctor调用的全局 operator new.