解决Lunix下的大内存分配运行失败问题---未解决

记录相关搜索记录

 

1.http://bbs.chinaunix.net/thread-953767-1-1.html

11.pam_limits认证模块

所属类型:session

功能描述:该模块限制用户会话过程中系统资源的使用率。缺省的,该模块的配置文件是/etc/security/limits.conf,可以使用conf参数指定自定义的配置文件。

可带参数:
issue=filename:指定其他配置文件,而不是缺省的/etc/issue.
noesc:不对配置文件中的转移字符进行解释。

配置文件说明:
debug:将调试信息写入日志
conf=filename:指定配置文件

配置文件说明:该配置文件每一行(一个条目)的语法如下:

在这里
可以是
用户名
用户组名,采用@group的语法
通配符*,表示任何
可以是
soft-表示软限制,可以超过该限制
hard-表示硬限制,有root设定,内核执行,不可以超过该限制
可以是
core-core文件大小 (KB)
data-最大数据大小(KB)
fsize-最大文件大小(KB)
memlock-最大可用内存空间(KB)
nofile-最大可以打开的文件数量
rss-最大可驻留空间(KB)
stack-最大堆栈空间(KB)
cpu-最大CPU使用时间(MIN)
nproc-最大运行进程数
as-地址空间限制
maxlogins-某一用户可以登录到系统的最多次数
locks-最大锁定文件数目
需要注意的是,如果无限制可以使用”-”号,并且针对用户限制的优先级要比针对组的
优先级高。

配置文件实例:
* soft core 0
* hard rss 10000
@student hard nproc 20
@faculty soft nproc 20
@faculty hard nproc 50

 

2http://blog.chinaunix.net/uid-27025492-id-3443360.html

Linux C 动态内存分配 malloc及相关内容2012-12-18 17:11:50

分类: LINUX

原文地址:http://blog.csdn.net/ssff1/article/details/5006722

一、malloc()和free()的基本概念以及基本用法:

1、函数原型及说明:

void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。

关于分配失败的原因,应该有多种,比如说空间不足就是一种。

void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。

2、函数的用法:

其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用够了就甩了它把它给free()了,举个简单例子:

程序代码:
// Code...
char *Ptr = NULL;
Ptr = (char *)malloc(100 * sizeof(char));
if (NULL == Ptr)
{
exit (1);
}
gets(Ptr);

// code...
free(Ptr);
Ptr = NULL;
// code...
就是这样!当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。

3、关于函数使用需要注意的一些地方:

A、申请了内存空间后,必须检查是否分配成功。

B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。

C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会

出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。

D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一些编译器的检查。

栈是由编译器自动分配释放,存放函数的参数值、局部变量的值等。操作方式类似于数据结构中的栈。

堆一般由程序员分配释放,若不释放,程序结束时可能由OS回收。注意这里说是可能,并非一定。所以我想再强调一次,记得要释放!


#include <stdio.h>
char *returnStr()
{
    char *p="hello world!";
    return p;
}
int main()
{
    char *str;
     str=returnStr();
    printf("%s/n", str);
   
    return 0;
}
#include <stdio.h>
char *returnStr()
{
    char p[]="hello world!";
    return p;
}
int main()
{
    char *str;
     str=returnStr();
    printf("%s/n", str);
   
    return 0;
}

想问下 这俩个函数中的p是不是都是函数的局部变量?
如果都是局部变量的话,那么他们应该都是“栈”上分配内存的啊。当函数结束的时候,都会被pop出来而销毁的。

答:

第1个,p是局部变量,但其指向的内存是全局的。函数返回后,虽然p本身销毁了,但它指向的内存仍存在,故不会有问题

第2个,数组p是局部的,返回后,数组内存被销毁,故有问题。


注意:第1个里面,字符串常量是占用全局内存(跟全局变量一样),其空间是程序加载时就分配了的(虽然在源代码中是出现在函数内部)。
   第2个中,p是函数运行时临时在栈上分配的数组。


动态分配的内存一直存在直到free,而相对应的变量(既使是指向动态分配内存)则根据其定义的位置而作用域不同。

 

你可能感兴趣的:(解决Lunix下的大内存分配运行失败问题---未解决)