1. 程式人生 > >智慧檢查linux c/c++程式碼是否有記憶體洩漏

智慧檢查linux c/c++程式碼是否有記憶體洩漏

檢查記憶體洩漏

​ 最令Linux程式設計師頭疼的莫過於記憶體洩露了,即使你是在優秀的程式設計師,你也不能保證所以的malloc操作都有對應的free,那必要的工具就是必不可少的了。在一般的Linux發行版中,有一個自帶的工具可以很方便的替你完成這些事,這個工具就是mtrace。

原始碼test.c:

#include <stdio.h>  
#include <mcheck.h>  
int main()
{  
    setenv("MALLOC_TRACE", "output", 1);  
    mtrace();  
    char * text = ( char
* ) malloc (sizeof(char) * 100);    
   return 0;   }  
  • 可以看出,只需要在你的程式中插入三行程式碼,就行

第一句,#include <mcheck.h>,包含標頭檔案

第二句,setenv("MALLOC_TRACE", "output", 1); 設定一個環境變數 MALLOC_TRACE=output

第三句,mtrace(),呼叫mtrace.
  • 將這個檔案編譯,注意,編譯的時候一地要加上gcc的-g選項。

gcc test.c -g -o test
  • 接著執行可執行檔案,然後你會發現當前目錄下多了一個output的檔案。

./test
  • 這個檔案自然不是文字檔案,所以需要工具來檢視。

[email protected]:~/workspace$ mtrace test output 
- 0x000000000090c010 Free 3 was never alloc'd 0x7f642f397e8d
- 0x000000000090c270 Free 4 was never alloc'd 0x7f642f46205f
- 0x000000000090c290 Free 5 was never alloc'd 0x7f642f4d1a6c

Memory not freed:
-----------------
           Address     Size     Caller
0x000000000090c700     0x64  at /home/where/workspace/test.c:8

​ Memory not freed:代表記憶體未被釋放。

相關推薦

智慧檢查linux c/c++程式碼是否記憶體洩漏

檢查記憶體洩漏​ 最令Linux程式設計師頭疼的莫過於記憶體洩露了,即使你是在優秀的程式設計師,你也不能保證所以的malloc操作都有對應的free,那必要的工具就是必不可少的了。在一般的Linux發行版中,有一個自帶的工具可以很方便的替你完成這些事,這個工具就是mtrace

python 牛客網 你的輸出為:空。請檢查一下你的程式碼沒有迴圈輸入處理多個case。問題解決

    你的輸出為:空。請檢查一下你的程式碼,有沒有迴圈輸入處理多個case。點選檢視如何處理多個case 核心:他這個程式測試正確與否的流程是 連續輸入多組測試資料進行測試,只有每組資料都對才行 所以必須使用下面的程式模組: 1 while True: 2 try

C++(二十三) — 記憶體洩漏及指標懸掛

1、記憶體洩漏    動態申請的記憶體空間沒有正常釋放,但也不能繼續使用。   char *pch1 = 0; pch1 = new char('A'); // 此處申請的空間未被釋放。 char *pch2 = new char; pch1 = pch2;

C++中基於Crt的記憶體洩漏檢測

儘管這個概念已經讓人說濫了 ,還是想簡單記錄一下, 以備以後查詢。#ifdef _DEBUG#define DEBUG_CLIENTBLOCK   new( _CLIENT_BLOCK, __FILE__, __LINE__)#else#define DEBUG_CLIENTBLOCK#endif

C#反射呼叫WebService引起記憶體洩漏

最近寫了一個小工具,用來定時檢測公司各臺伺服器上的WebService是否工作正常.如果無法訪問則報警. 開發思路也很簡單, 設定一個Timer, 定時啟動多個執行緒(每個執行緒負責N臺伺服器訪問任務)去動態訪問各伺服器上的WebService的指定方法. 然後對異常資訊進

Linux 部署C++音訊讀取方法程式碼遇到的問題:

參考連結:No such file or directory #include <io.h> firstError: io.h: No such file 用命令查詢io.h所在位置: find /usr/include -name “io.h”, 結果發現在/usr/inc

SSL握手通訊詳解及linuxc/c++ SSL Socket(另附SSL雙向認證客戶端程式碼)

SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網路通訊提供安全及資料完整性的一種安全協議。TLS與SSL在傳輸層對網路連線進行加密。   安全證書既包含了用於加密資料的金鑰

linuxC語言__FILE__,__LINE__,FUNCTION__實現程式碼跟蹤除錯

__FILE__,__LINE__,FUNCTION__實現程式碼跟蹤除錯(linux下C語言程式設計 )先看下簡單的初始程式碼:注意其編譯執行後的結果。 [email protected]:~/cpropram/2# cat global.h //標頭檔案 #

Windows or Linux環境下利用“共享記憶體”實現程序間通訊的C/C++程式碼

程序A對應的程式: #include <iostream> #include <windows.h> using namespace std; #define BUF_SIZE 1025 char szName[] = "NameOfMappi

C語言程式碼的標頭檔案與原始檔什麼區別?

標頭檔案和原始檔在本質上沒有任何區別。 字尾為  .h 的檔案是標頭檔案,內含函式宣告、巨集定義、結構體定義等內容。 字尾為  .c 的檔案是原始檔,內含函式實現,變數定義等內容。而且是什麼字尾也沒有關係,只不過編譯器會預設對某些字尾的檔

C#靜態程式碼檢查工具StyleCode -- 初探

最近我們Advent Data Service (ADS) 在專案上需要按照程式碼規範進行程式碼的編寫工作,以方便將來程式碼的閱讀與維護。 但是人工檢查起來容易遺漏或者格式不統一, ReSharper又是收費的,而且費用不菲。 於是美國的同事推薦了我們一款開源工

JIN學習一、Android使用已C/C++程式碼、第三方SO庫的方法

1.配置好NDk編譯環境(這個Google一下,:)) 2.將已有C/C++程式碼,編譯成SO檔案 3.Eclipse中新建Android工程,建立一個jni目錄。如下所示 4.在jni目錄建立C/C++檔案,裡面呼叫步驟2函式,或者第三方SO的函式 5.建立Androi

Android使用已C/C++程式碼、第三方SO庫的方法(JIN學習)

1.配置好NDk編譯環境(這個Google一下,:)) 2.將已有C/C++程式碼,編譯成SO檔案 3.Eclipse中新建Android工程,建立一個jni目錄。如下所示 4.在jni目錄建立C/C++檔案,裡面呼叫步驟2函式,或者第三方SO的函式 5.建

Linux下如何編譯多個檔案(包括不同目錄下的.c/.h檔案)的C/C++程式

在Linux下要編譯一個C/C++程式,首先要知道包含目錄的作用,對C/C++有了解的就會知道,#include是包含標頭檔案所用的,也就說說部分類、函式、或者變數宣告就在其中。而#include巨集定義又有兩種: #include""和#include <>

Emacs配置C/C++-mode的程式碼智慧提示和自動補全

;;一鍵快速編譯 C++-mode (defun quick-compile ()"A quick compile funciton for C++" (interactive) (compile (concat "g++ -g -pg " (buffer-name (current-buffer))

linux fork多程序併發伺服器模型之C/C++程式碼實戰

        在很早的文章中, 我們一起聊過伺服器如何與多個客戶端進行通訊, 那時, 我們要麼用select, 要麼用多執行緒, 卻沒有用多程序。 其實, 多程序也可以實現與多個客戶端進行通訊。          如果是在while中迴圈accept,  然後迴圈處理事情

Linux 環境下C/C++獲取系統時間 && 每隔500ms迴圈一次程式碼實現

環境:NetBeans IDE 8.2 + 遠端主機Linux 獲取當前系統時間getCurrentTime()程式碼如下: #include<sys/time.h> long getCurrentTime(){ struct timeval tv; gett

linux c 程式碼測試之記憶體越界及記憶體洩露

 記憶體越界是我們軟體開發中經常遇到的一個問題。不經意間的複製常常導致很嚴重的後果。經常使用memset、memmove、strcpy、strncpy、strcat、sprintf的朋友肯定對此印象深刻,下面就是我個人在開發中實際遇到的一個開發問題,頗具典型。 #

Linuxc語言實驗Websocket通訊 含客戶端和伺服器測試程式碼

Websocket是一種可雙向通訊的網路協議,其底層的資料收發是基於socket的,所以使用c語言來實現理論上是沒有問題的,主要難點在於協議中要求對個別資料進行加密處理,這些加密方法(庫)在java、c#等專門開發web的平臺中都是自帶的API(隨調隨到),而在用到c

c/c++ 程式碼格式化(linux風格)

"==============.vimrc指令碼================="NeoBundle Scripts-----------------------------if &compatible  set nocompatible               " Be iMprovedend