現在的位置: 首頁 > 綜合 > 正文

解決Lunix下的大內存分配運行失敗問題—未解決

2018年04月03日 ⁄ 綜合 ⁄ 共 2399字 ⁄ 字型大小 評論關閉

記錄相關搜索記錄

 

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,而相對應的變數(既使是指向動態分配內存)則根據其定義的位置而作用域不同。

 

抱歉!評論已關閉.