锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
1錛嶥WORD timeGetTime(void)
銆 榪斿洖浠嶹indows鍚姩寮濮嬬粡榪囩殑姣鏁般傛渶澶у間負(fù)232錛岀害49.71澶┿?nbsp;
2錛嶮MRESULT timeSetEvent(
銆銆UINT uDelay,
銆銆UINT uResolution,
銆銆LPTIMECALLBACK lpTimeProc,
銆銆DWORD dwUser,
銆銆UINT fuEvent)
銆 璇ュ嚱鏁拌緗竴涓畾鏃跺洖璋冧簨浠訛紝姝や簨浠跺彲浠ユ槸涓涓竴嬈℃т簨浠舵垨鍛ㄦ湡鎬т簨浠躲備簨浠朵竴鏃﹁嬋媧伙紝渚胯皟鐢ㄦ寚瀹氱殑鍥炶皟鍑芥暟錛屾垚鍔熷悗榪斿洖浜嬩歡鐨勬爣璇嗙浠g爜錛屽惁鍒欒繑鍥濶ULL銆傚弬鏁拌鏄庡涓嬶細(xì)
銆銆uDelay錛氫互姣鎸囧畾浜嬩歡鐨勫懆鏈熴?
銆銆UResolution錛氫互姣鎸囧畾寤舵椂鐨勭簿搴︼紝鏁板艱秺灝忓畾鏃跺櫒浜嬩歡鍒嗚鯨鐜囪秺楂樸傜己鐪佸間負(fù)1ms銆?
銆銆LpTimeProc錛氭寚鍚戜竴涓洖璋冨嚱鏁般?
銆銆DwUser錛氬瓨鏀劇敤鎴鋒彁渚涚殑鍥炶皟鏁版嵁銆?
銆銆FuEvent錛氭寚瀹氬畾鏃跺櫒浜嬩歡綾誨瀷錛?
銆銆TIME_ONESHOT錛歶Delay姣鍚庡彧浜х敓涓嬈′簨浠?
銆銆TIME_PERIODIC 錛氭瘡闅攗Delay姣鍛ㄦ湡鎬у湴浜х敓浜嬩歡銆?nbsp;
3錛嶮MRESULT timeKillEvent(UINT uTimerID)
銆 璇ュ嚱鏁板彇娑堜竴涓寚瀹氱殑瀹氭椂鍣ㄥ洖璋冧簨浠躲倁TimerID鏍囪瘑瑕佸彇娑堢殑浜嬩歡錛堢敱timeSetEvent鍑芥暟榪斿洖鐨勬爣璇嗙錛夈傚鏋滄垚鍔熷垯榪斿洖TIMERR_NOERROR錛屽鏋滃畾鏃跺櫒鏃墮棿涓嶅瓨鍦ㄥ垯榪斿洖MMSYSERR_INVALPARAM銆?nbsp;
4錛庡洖璋冨嚱鏁?br> 銆銆void CALLBACK TimeProc(
銆銆UINT uID,
銆銆UINT uMsg,
銆銆DWORD dwUser,
銆銆DWORD dw1,
銆銆DWORD dw2);
銆銆璇ュ嚱鏁版槸涓涓簲鐢ㄧ▼搴忓畾涔夌殑鍥炶皟鍑芥暟錛屽嚭鐜板畾鏃跺櫒浜嬩歡鏃惰鍑芥暟琚皟鐢ㄣ俆imeProc鏄簲鐢ㄧ▼搴忓畾涔夌殑鍑芥暟鍚嶇殑鍗犱綅絎︺備嬌鐢ㄨ鍑芥暟
鏃惰娉ㄦ剰鐨勬槸錛屽畠鍙兘璋冪敤浠ヤ笅鏈夐檺鐨勫嚑緇凙PI鍑芥暟錛歅ostMessage錛宼imeGetSystemTime錛? timeGetTime錛? timeSetEvent錛宼imeKillEvent
錛宮idiOutShortMsg, midiOutLongMsg錛孫utputDebugString銆傚悓鏃朵篃涓嶈浣跨敤瀹屾垚鏃墮棿寰堥暱鐨凙PI鍑芥暟錛岀▼搴忓敖鍙兘綆鐭?nbsp;
銆銆浣跨敤浠ヤ笂涓緇勫嚱鏁板氨鍙互瀹屾垚姣綰х簿搴︾殑璁℃椂鍜屾帶鍒訛紙鍦–++Builder涓嬌鐢ㄦ椂瑕佸皢澶存枃浠秏msystem.h鍔犲埌紼嬪簭涓級銆傜敱浜庡皢瀹氭椂鎺?
鍒剁簿紜埌鍑犳縐掞紝瀹氭椂鍣ㄤ簨浠跺皢鍗犵敤澶ч噺鐨凜PU鏃墮棿鍜岀郴緇熻祫婧愶紝鎵浠ュ湪婊¤凍鎺у埗瑕佹眰鐨勫墠鎻愪笅錛屽簲灝介噺灝嗗弬鏁皍Resolution鐨勬暟鍊煎澶с傝?
涓斿畾鏃跺櫒瀹炴椂鎺у埗鍔熻兘瀹屾垚鍚庤灝藉揩閲婃斁銆?nbsp;
娉ㄦ剰浠ヤ笅鍑犵偣闂錛?br>涓銆佸洖璋冨嚱鏁扮殑鍙傛暟涓嶈兘鏈夎錛屽惁鍒欏彲鑳藉紩璧風(fēng)▼搴忓穿鎺夛紱
浜屻佷簨浠惰皟鐢ㄥ懆鏈焨Delay涓嶈兘灝忎簬浜嬩歡澶勭悊鏃墮棿錛屽惁鍒欎細(xì)寮曡搗紼嬪簭宕╂簝錛?br>涓夈侀氳繃dwUser緇欏洖璋冨嚱鏁頒紶閫掑弬鏁?/span>
渚嬬▼濡備笅錛?br>
MMRESULT g_wTimerID = 0;
//鍥炶皟鍑芥暟錛屽弬鏁頒笉鑳芥湁閿?/span>
2
void CALLBACK CDsisiiDlg::SendFun(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dwl, DWORD dw2)
3

{
CDsisiiDlg* pdcpackerdlg = (CDsisiiDlg*)dwUser;
...
4
}
5
6
bool CDsisiiDlg::CreateTimer()
7

{
8
TIMECAPS tc;
9
UINT wTimerRes;
10
11
//璁劇疆澶氬獟浣撳畾鏃跺櫒
12
if(timeGetDevCaps(&tc,sizeof(TIMECAPS))!=TIMERR_NOERROR)//鍚戞満鍣ㄧ敵璇蜂竴涓濯掍綋瀹氭椂鍣?nbsp;
13
return false;
14
15
//鑾峰緱鏈哄櫒鍏佽鐨勬椂闂撮棿闅旓紙涓鑸彲杈懼埌1姣錛?nbsp;
16
wTimerRes=min(max(tc.wPeriodMin,1),tc.wPeriodMax);
17
18
//瀹氭椂鍣ㄥ紑濮嬪伐浣?nbsp;
19
timeBeginPeriod(wTimerRes);
20
21
//姣忚繃6姣璋冪敤鍥炶皟鍑芥暟timerback(),wTimerID涓哄畾鏃跺櫒ID.TIME_PERIODIC琛ㄥ懆鏈熸ц皟鐢紝TIME_ONESHOT琛ㄥ彧浜х敓涓嬈′簨浠?nbsp;
22
g_wTimerID = timeSetEvent(6, wTimerRes, (LPTIMECALLBACK)SendFun, (DWORD)this, TIME_PERIODIC);
23
if(g_wTimerID == 0)
24
return false;
25
26
return true;
27
}
28
29
//鍒犻櫎瀹氭椂鍣?/span>
30
void CDsisiiDlg::DestroyTimer()
31

{
32
if (g_wTimerID)
33
{
34
timeKillEvent(g_wTimerID);
35
g_wTimerID = 0;
36
}
37
}
]]>
鍑芥暟鐨勫紩鍏ュ彲浠ュ噺灝戠▼搴忕殑鐩爣浠g爜錛屽疄鐜扮▼搴忎唬鐮佺殑鍏變韓銆備絾鏄紝鍑芥暟璋冪敤涔熼渶瑕佷竴浜涙椂闂村拰絀洪棿鏂歸潰鐨勫紑閿錛屽洜涓鴻皟鐢ㄥ嚱鏁板疄闄呬笂灝嗙▼搴忔墽琛屾祦紼嬭漿縐誨埌琚皟鍑芥暟涓紝琚皟鍑芥暟鐨勭▼搴忎唬鐮佹墽琛屽畬鍚庯紝鍐嶈繑鍥炲埌璋冪敤鐨勫湴鏂廣傝繖縐嶈皟鐢ㄦ搷浣滆姹傝皟鐢ㄥ墠淇濇姢鐜板満騫惰蹇嗘墽琛岀殑鍦板潃錛岃繑鍥炲悗鎭㈠鐜板満錛屽茍鎸夊師鏉ヤ繚瀛樼殑鍦板潃緇х畫鎵ц銆傚浜庤緝闀跨殑鍑芥暟榪欑寮閿鍙互蹇界暐涓嶈錛屼絾鏄浜庝竴浜涘嚱鏁頒綋浠g爜寰堢煭錛屼絾鍙堣棰戠箒鍦拌皟鐢ㄧ殑鍑芥暟錛屽氨涓嶈兘蹇借榪欑寮閿銆傚紩鍏ュ唴鑱斿嚱鏁板拰瀹忓嚱鏁版鏄負(fù)浜嗚В鍐寵繖涓棶棰橈紝鎻愰珮紼嬪簭鐨勮繍琛屾晥鐜囥?銆銆
鍦ㄧ▼搴忕紪璇戞椂錛岀紪璇戝櫒灝嗙▼搴忎腑鍑虹幇鐨勫唴鑱斿嚱鏁?瀹忓嚱鏁?鐨勮皟鐢ㄨ〃杈懼紡鐢ㄥ唴鑱斿嚱鏁?瀹忓嚱鏁?鐨勫嚱鏁頒綋鏉ヨ繘琛屾浛鎹€傜敱浜庡湪緙栬瘧鏃跺皢鍑芥暟浣撲腑鐨勪唬鐮佹浛浠e埌紼嬪簭涓紝鍥犳浼?xì)澧炲姞鐩爣绋嬪簭浠g爜閲忓Q岃繘鑰屽鍔犵┖闂村紑閿錛岃屽湪鏃墮棿寮閿涓婁笉璞″嚱鏁拌皟鐢ㄦ椂閭d箞澶э紝鍙瀹冩槸浠ョ洰鏍囦唬鐮佺殑澧炲姞涓轟唬浠鋒潵鎹㈠彇鏃墮棿鐨勮妭鐪併?br>鍦ㄧ被闈欐佹暟鎹垚鍛樹笉鍚屼簬闈為潤鎬佺殑鏁版嵁鎴愬憳錛屼竴涓被鐨勯潤鎬佹暟鎹垚鍛樹粎鍒涘緩鍜屽垵濮嬪寲涓嬈★紝涓斿湪紼嬪簭寮濮嬫墽琛岀殑鏃跺欏垱寤猴紝鐒跺悗琚綾葷殑鎵鏈夊璞″叡浜紱鑰岄潪闈欐佺殑鏁版嵁鎴愬憳鍒欓殢鐫瀵硅薄鐨勫垱寤鴻屽嬈″垱寤哄拰鍒濆鍖? static鎴愬憳鏄斁鍦ㄩ潤鎬佸瓨鍌ㄥ尯鐨勶紝瀹冨茍涓嶅彈璁塊棶鎺у埗絎︾殑闄愬埗錛岃屽叾瀹冪殑鎴愬憳鍙橀噺鍒欐槸鏀懼湪鏍堜腑鐨勩?br>
浜屻佷嬌鐢ㄦ柟闈?/strong>
1錛歸indows鐨勫洖璋冨嚱鏁頒嬌鐢ㄩ潤鎬佸嚱鏁幫細(xì)
鍦ㄧ被涓紝static鍨嬬殑鎴愬憳鍑芥暟錛岀敱浜庢槸綾繪墍鎷ユ湁鐨勶紝鑰屼笉鏄叿浣撳璞℃墍鏈夌殑錛岃繖涓鐐瑰浜巜indows鐨勫洖璋冩満鍒墮潪甯告湁鐢ㄣ傚洜涓哄浜庡洖璋冨嚱鏁拌岃█錛寃indows涓嶄細(xì)鍊熷姪浠諱綍瀵硅薄鍘昏皟鐢ㄥ畠錛屼篃灝變笉浼?xì)浼犻抰his鎸囬拡錛岄偅涔堝浜庝竴鑸垚鍛樺嚱鏁頒綔涓哄洖璋冨嚱鏁扮殑鍚庢灉錛屽氨鏄爢鏍堜腑鏈変竴涓殢鏈虹殑鍙橀噺浼?xì)鎴愪负this鎸囬拡錛岃繖褰撶劧浼?xì)寮曞彂绋嬪簭鐨勫穿婧冦傝宻tatic鍑芥暟錛岀敱浜庢槸鏁翠釜綾葷殑錛屽睆钄戒簡this鎸囬拡銆傚洜姝わ紝濡傛灉鎴愬憳鍑芥暟浣滀負(fù)鍥炶皟鍑芥暟錛屽氨搴旇鐢╯tatic鍘諱慨楗板畠銆?br>
2錛氱嚎紼嬫帶鍒跺嚱鏁板父浣跨敤闈欐佸嚱鏁?br>闈欐佸嚱鏁版湁鐗瑰畾鐨勫湴鍧絀洪棿錛岃繖鏍峰彲浠ラ伩鍏嶅湪榪愯鏃秙ystem瀵瑰唴瀛樿皟鏁村甫鏉ョ殑闂銆?br>
3錛歐indows緋葷粺API錛屼篃甯鎬嬌鐢ㄩ潤鎬佸嚱鏁?br>
璋冪敤鏂歸潰錛屼笉鐢ㄥ湪璋冪敤鍓嶅疄渚嬪寲銆?br>
涓夈佸疄渚嬩唬鐮?br>
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <string.h>
class Directory

{
public:
// 闈欐佸叕鏈夌殑鍑芥暟
Directory()
{
strcpy(strTemp,"/嫻嬭瘯");
i=15;
}
static void setpath(char const *newpath);
static void setname( Directory *dir);
void getpath(char *oldpath);
char strTemp [50];
int i;
private:
//闈欐佸瓧絎︿覆
static char path [];
};
//闈欐佹暟鎹垚鍛樼殑鍒濆鍖?/span>
char Directory::path [199] = "/寮濮嬫祴璇?/span>";
// 闈欐佸嚱鏁拌闂潤鎬佸彉閲?/span>
void Directory::setpath(char const *newpath)

{
printf("path=%s\n",path);
strncpy(path, newpath, 199);
printf("path=%s\n",path);
}
//闈欐佸嚱鏁拌闂潪闈欐佸彉閲?/span>
void Directory::setname(Directory *dir)

{
dir->getpath("/闈欐佸嚱鏁拌闂潪闈欐佸嚱鏁?/span>");
dir->strTemp;//闈欐佸嚱鏁拌闂潪闈欐佸彉閲?/span>
return;
}
// 闈為潤鎬佸嚱鏁拌闂潤鎬佸彉閲?/span>
void Directory::getpath(char *oldpath)

{
strncpy(Directory::path,oldpath, 199);
printf("Directory::path=%s\n",Directory::path);
}
// 浣跨敤瀹炰緥
void main()

{
// 閫氳繃綾誨悕璋冪敤setpath()鎴愬憳鍑芥暟
//Directory::setpath("/閫氳繃綾誨悕璋冪敤闈欐佹垚鍛樺嚱鏁?);
//閫氳繃瀵硅薄璋冪敤setpath()鎴愬憳鍑芥暟
Directory dir;
dir.setpath("/闈欐佸嚱鏁拌闂潤鎬佸彉閲?/span>");
dir.getpath("/闈為潤鎬佸嚱鏁拌闂潤鎬佸彉閲?/span>");
Directory *dira;
dir.setname(dira);
}
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a >http://blog.csdn.net/shuigsls/archive/2008/07/13/2645918.aspx
浜掓枼錛坢utex錛?/span>
浜掓枼姣旇緝綾諱技闃誨錛屽叧閿湪浜庝簰鏂ュ彲浠ヨ法榪涚▼鐨勭嚎紼嬪悓姝ワ紝寰堝鍙厑璁稿簲鐢ㄧ▼搴忚繍琛屼竴嬈$殑瀹炰緥灝辨槸鐢ㄤ簰鏂ユ柟娉曟潵瀹炵幇鐨勩備簰鏂ョ敤鍒頒互涓嬬殑API鍑芥暟錛?
createMutex(), 鍒涘緩浜掓枼瀵硅薄銆?
releaseMutex(), 瑙i櫎浜掓枼鍏崇郴銆?
浜掓枼鐨勪竴鑸嬌鐢ㄦ祦紼嬶細(xì)
棣栧厛createMutex鍒涘緩浜掓枼瀵硅薄錛岀劧鍚巜aitForSingleObject榪涘叆浜掓枼鐜錛屽綋鐢ㄥ埌鍚屾鐨勪唬鐮佹墽琛屽畬鎴愬悗錛岀敤releaseMutex瑙i櫎浜掓枼鍏崇郴錛屽綋鎵鏈夌嚎紼嬭闂畬鍚庯紝璋冪敤
closeHandle鏂規(guī)硶閲婃斁浜掓枼瀵硅薄銆?
waitForSingleObject()鍑芥暟鏉ラ槻姝㈠叾瀹冪嚎紼嬭繘鍏ュ悓姝ュ尯鍩熺殑浠g爜銆?
function waitforsingleobject(hHandle: Thandle; dwMilliseconds: DWORD): DWORD; stdcall;
榪欎釜鍑芥暟鍙互浣垮綋鍓嶇嚎紼嬪湪dwmilliseconds鎸囧畾鐨勬椂闂村唴鐫$湢錛岀洿鍒癶Handle鍙傛暟鎸囧畾鐨勫璞¤繘鍏ュ彂淇″彿鐘舵佷負(fù)姝€備竴涓簰鏂ュ璞′笉鍐嶈綰跨▼鎷ユ湁鏃訛紝瀹冨氨榪涘叆鍙戜俊鍙風(fēng)姸鎬?
褰撲竴涓繘紼嬭緇堟鏃訛紝瀹冨氨榪涘叆鍙戜俊鍙風(fēng)姸鎬併俤wmilliseconds鍙傛暟鍙互璁句負(fù)0錛岃繖鎰忓懗鐫鍙鏌handle鍙傛暟鎸囧畾鐨勫璞℃槸鍚﹀鐞嗗彂淇″彿鐘舵侊紝鑰屽悗绔嬪嵆榪斿洖銆俤wmilliseconds鍙傛暟璁句負(fù)INFINITE錛岃〃紺哄鏋滀俊鍙蜂笉鍑虹幇灝嗕竴鐩寸瓑涓嬪幓銆?
waitForSingeObject()浣跨敤鐨勮繑鍥炲煎強(qiáng)鍏跺惈涔夛細(xì)
WAIT ABANDONED
鎸囧畾鐨勫璞℃槸浜掓枼瀵硅薄錛屽茍涓旀嫢鏈夎繖涓簰鏂ュ璞$殑綰跨▼鍦ㄦ病鏈夐噴鏀炬瀵硅薄涔嬪墠灝卞凡緇堟銆傛鏃跺氨縐頒簰鏂ュ璞¤鎶涘純銆傝繖縐嶆儏鍐典笅錛岃繖涓簰鏂ュ璞″綊褰撳墠綰跨▼鎵鏈夛紝騫舵妸瀹冭涓轟笉鍙戜俊鍙風(fēng)姸鎬併?
WAIT OBJECT 0
鎸囧畾鐨勫璞″浜庡彂淇″彿鐘舵?
WAIT TIMEOUT
絳夊緟鐨勬椂闂村凡榪囷紝瀵硅薄浠嶇劧鏄潪鍙戜俊鍙風(fēng)姸鎬?
褰撲竴涓簰鏂ュ璞′笉鍐嶈涓涓嚎紼嬫墍鎷ユ湁錛屽畠?yōu)澶勪簬鍙戜俊鍙风姸鎬併傛鏃墮鍏堣皟鐢╳aitForsingleobject()鐨勭嚎紼嬪氨鎴愪負(fù)璇ヤ簰鏂ュ璞$殑鎷ユ湁鑰咃紝姝や簰鏂ュ璞¤涓轟笉鍙戜俊鍙風(fēng)姸鎬併傚綋綰跨▼璋冪敤releaseMutex()騫朵紶閫掍竴涓簰鏂ュ璞$殑鍙ユ焺浣滀負(fù)鍙傛暟鏃訛紝榪欑鎷ユ湁鍏崇郴灝辮瑙i櫎錛屼簰鏂ュ璞¢噸鏂拌繘鍏ュ彂淇″彿鐘舵併傞櫎waitforsingleobject()澶栵紝榪樺彲浠ヤ嬌鐢╳aitformultipleobject()鍜宮sgwaitformultipleobject()錛屽畠浠彲浠ョ瓑寰呭嚑涓璞″彉涓哄彂淇″彿鐘舵併?
淇″彿閲忥紙semaphore錛?/span>
鍙︿竴縐嶄嬌綰跨▼鍚屾鐨勬妧鏈槸浣跨敤淇″彿閲忓璞°傚畠鏄湪浜掓枼鐨勫熀紜涓婂緩绔嬬殑銆備絾淇″彿閲忓鍔犱簡璧勬簮璁℃暟鐨勫姛鑳斤紝棰勫畾鏁扮洰鐨勭嚎紼嬪厑璁稿悓鏃惰繘鍏ヨ鍚屾鐨勪唬鐮併傜敤
createSemaphore()鏉ュ垱寤轟竴涓俊鍙烽噺瀵硅薄錛屽叾澹版槑濡備笅錛?
function createsemaphore(lpSemaphoreAttributes: pSecurityAttributes;
lInitalCount, lMaximunCount: longint; lpName: pchar): Thandle; stdcall;
鍜宑reatemutex()涓鏍鳳紝createsemaphore()鐨勭涓涓弬鏁頒篃鏄竴涓寚鍚慣securityAttributes璁板綍鐨勬寚閽堬紝姝ゅ弬鏁扮殑緙哄皯鍊煎彲浠ヨ涓簄il銆俵Initialcount鍙傛暟鐢ㄦ潵鎸囧畾涓俊鍙烽噺鐨勫垵濮嬭鏁?br>鍊鹼紝榪欎釜鍊煎繀欏誨湪0鍜宭Maximumcount涔嬮棿銆傛鍙傛暟澶т簬0 錛屽氨琛ㄧず淇″彿閲忓浜庡彂淇″彿鐘舵併傚綋璋冪敤waitforsingleobject()鏃訛紝姝よ鏁板煎氨鍑?銆傚綋璋冪敤releasesemaphore()鏃訛紝姝よ鏁板煎姞1銆傚弬鏁發(fā)Maximumcount鎸囧畾璁℃暟鍊肩殑鏈澶у箋傚鏋滆繖涓俊鍙烽噺浠h〃鏌愮璧勬簮錛岄偅涔堣繖涓間唬琛ㄥ彲鐢ㄨ祫婧愭繪暟銆傚弬鏁發(fā)pName鐢ㄤ簬緇欏嚭淇″彿閲忓璞$殑鍚嶇О銆傜被浼間簬createmutex()鐨刲pName鍙傛暟銆?
releaseSemaphore()鐨勫0鏄庯細(xì)
function releaseSemaphore(hsemaphore: Thandle; lreleasecount: longint;
lppreviouscount: pointer): bool; stdcall;
ireleasecount鍙傛暟鐢ㄤ簬鎸囧畾姣忔浣胯鏁板煎姞澶氬皯銆傚鏋滃弬鏁發(fā)ppreviouscount涓嶄負(fù)nil錛屽師鏈夌殑璁℃暟鍊煎皢瀛樺偍鍦╨ppreviouscount閲屻備俊鍙烽噺瀵硅薄騫朵笉灞炰簬鏌愪釜綰跨▼銆傝浣忥紝鏈鍚庝竴瀹氳璋冪敤colsehandle()鏉ラ噴鏀劇敱createsemaphore()鍒涘緩鐨勪俊鍙烽噺瀵硅薄鐨勫彞鏌勩?/p>
CSTI* ocsti = new CSTI();
delete ocsti; //紼嬪簭宕╂帀
鍑虹幇濡備笅閿欒錛?br>
鍑虹幇榪欎釜閿欒鐨勫師鍥犱竴鑸兘鏄搷浣渘ew鐢寵鐨勫唴瀛樻孩鍑?鍥犱負(fù)鍦╟++涓?濡傛灉鐢╪ew鍒嗛厤涓孌靛唴瀛?鎿嶄綔鐨勬椂鍊欐敼鍙樹簡璇ラ儴鍒嗙殑澶у皬,鍦╠elete鏃跺氨浼?xì)鍑洪?姣斿璇村涓嬮儴鍒?
char* p=new char[5];
strcpy(p,"aaaaa");
delete[] p;
榪欐浠g爜灝變細(xì)鍑洪敊,鍥犱負(fù)鐢寵浜嗕竴涓猻ize涓?鐨勫唴瀛?浣嗘槸strcpy榪囧幓浜嗕竴涓猻ize涓?鐨勫瓧絎︿覆,鍥犳鐮村潖浜嗚繖涓寚閽?榪愯debug鐗堟湰鐨勬椂鍊?灝變細(xì)鍑虹幇鍏堝墠鐨勯敊璇?浣嗘槸鍦╮elease鐗堟湰涓?婧㈠嚭涓涓瓧鑺傜殑鍐呭瓨寰堟湁鍙兘鏄病鏈夐敊璇殑,鐒跺悗娼滃湪鐨勯殣鎮(zhèn)f槸鑲畾瀛樺湪鐨?鍥犳,鎴戜滑鍦╠ebug閬囧埌榪欐牱鐨勯敊璇椂鍊欎竴瀹氳浠旂粏媯鏌ュnew鍑虹殑鎸囬拡鐨勬搷浣?
鑰屾垜騫舵湭瀵圭敵璇風(fēng)殑鍐呭瓨鍋氫換浣曟搷浣滃氨鎶ュ唴瀛樻孩鍑虹殑閿欒錛岄偅涔堝彲鑳藉氨鏄洜涓簄ew鏃剁敵璇風(fēng)殑鍐呭瓨澶皬錛屾渶鍚庣粡楠岃瘉鍙戠幇鏄洜涓虹敤鐨勬棫鐨勫ご鏂囦歡寮曡搗鐨勯敊璇紝鍚庢潵鎹㈡柊鐨勫ご鏂囦歡鍚庡氨涓嶅湪鎶ラ敊浜嗐傛垜璇曠潃鎶婃柊銆佹棫澶存枃浠剁敵璇風(fēng)殑鍐呭瓨澶у皬鎵撳嚭鏉ユ瘮杈冿紝鍙戠幇鏂扮殑澶存枃浠舵灉鐒舵瘮鏃х殑鍐呭瓨瑕佸ぇ銆?br>
榪欐槸鍦ㄧ敤鍒漢鎻愪緵鐨勫簱鏃墮亣鍒扮殑闂錛屾墍浠ュ湪鎻愪緵鍒漢搴撴椂瑕佺湅鐪嬪ご鏂囦歡鏄惁涔熸湁鏇存柊銆?/p>
class a

{
public:
static FunctionA()
{
menber = 1;
}
private:
int menber;
}緙栬瘧涓婅堪浠g爜錛屽嚭閿欍傚師鍥犲緢綆鍗曞ぇ瀹墮兘鐭ラ亾錛岄潤鎬佹垚鍛樺嚱鏁頒笉鑳借闂潪闈欐佹垚鍛橈紝榪欐槸鍥犱負(fù)闈欐佸嚱鏁板睘浜庣被鑰屼笉鏄睘浜庢暣涓璞★紝闈欐佸嚱鏁頒腑鐨?member鍙兘閮芥病鏈夊垎閰嶅唴瀛樸傞潤鎬佹垚鍛樺嚱鏁版病鏈夐殣鍚殑this鑷彉閲忋傛墍浠ワ紝瀹冨氨鏃犳硶璁塊棶鑷繁綾葷殑闈為潤鎬佹垚鍛樸傦紙鐪嬭繃涓綃囧緢濂界殑鏂囩珷銆婃祬鏋怌++涓殑this鎸囬拡銆?/font>浠嬬粛榪欎釜鏂歸潰鐨勮緇嗗唴瀹癸級
閭h鎯寵闂庝箞鍔炲憿錛熷湴鐞冧漢閮界煡閬撳彧瑕佸皢錛?br>
int menber;
//change the line above to:
static int menber;
class a

{
public:
static FunctionA(a* _a)
{
a-> menber = 1;
}
private:
int menber;
}
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);
int index=0;
int tickets=100;
HANDLE hMutex;
void main()

{
HANDLE hThread1,hThread2;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
hMutex=CreateMutex(NULL,FALSE,NULL);
//TRUE浠h〃涓葷嚎紼嬫嫢鏈変簰鏂ュ璞?nbsp;浣嗘槸涓葷嚎紼嬫病鏈夐噴鏀捐瀵硅薄 浜掓枼瀵硅薄璋佹嫢鏈?nbsp;璋侀噴鏀?br>
//FLASE浠h〃褰撳墠娌℃湁綰跨▼鎷ユ湁榪欎釜浜掓枼瀵硅薄
Sleep(4000);
}
DWORD WINAPI Fun1Proc(LPVOID lpParameter)

{
while (true)
{
WaitForSingleObject(hMutex,INFINITE);
if (tickets>0)
{
cout<<"t1: "<<tickets--<<endl;
}
else
{
break;
}
ReleaseMutex(hMutex);
}
return 0;
}
DWORD WINAPI Fun2Proc(LPVOID lpParameter)

{
while (true)
{
WaitForSingleObject(hMutex,INFINITE);
if (tickets>0)
{
cout<<"t2: "<<tickets--<<endl;
}
else
{
break;
}
ReleaseMutex(hMutex);
}
return 0;
}

HANDLE hMutex = CreateMutex(NULL, false, "Process");
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hMutex);
MessageBox(Application->Handle, "紼嬪簭宸茬粡鍦ㄨ繍琛屼腑錛屼笉鑳介噸澶嶅惎鍔紒", "鎻愮ず", MB_OK +MB_ICONWARNING);
Application->Terminate();
return 0;
}
Application->CreateForm(__classid(TForm1), &Form1);
void *handle = FindWindow(NULL, WindowName.c_str());
if (handle!=NULL)
return 0; 
榪涚▼鐨勪簰鏂ヨ繍琛?/p>
銆銆姝e父鎯呭喌涓嬶紝涓涓繘紼嬬殑榪愯涓鑸槸涓嶄細(xì)褰卞搷鍒板叾浠栨鍦ㄨ繍琛岀殑榪涚▼鐨勩備絾鏄浜庢煇浜涙湁鐗規(guī)畩瑕佹眰鐨勫浠ョ嫭鍗犳柟寮忎嬌鐢ㄤ覆琛屽彛絳夌‖浠惰澶囩殑紼嬪簭灝辮姹傚湪鍏惰繘紼嬭繍琛屾湡闂翠笉鍏佽鍏朵粬璇曞浘浣跨敤姝ょ鍙h澶囩殑紼嬪簭榪愯鐨勶紝鑰屼笖姝ょ被紼嬪簭閫氬父涔熶笉鍏佽榪愯鍚屼竴涓▼搴忕殑澶氫釜瀹炰緥銆傝繖灝卞紩鍑轟簡榪涚▼浜掓枼鐨勯棶棰樸?/p>
銆銆瀹炵幇榪涚▼浜掓枼鐨勬牳蹇冩濇兂姣旇緝綆鍗曪細(xì)榪涚▼鍦ㄥ惎鍔ㄦ椂棣栧厛媯鏌ュ綋鍓嶇郴緇熸槸鍚﹀凡緇忓瓨鍦ㄦ湁姝よ繘紼嬬殑瀹炰緥錛屽鏋滄病鏈夛紝榪涚▼灝嗘垚鍔熷垱寤哄茍璁劇疆鏍囪瘑瀹炰緥宸茬粡瀛樺湪鐨勬爣璁般傛鍚庡啀鍒涘緩榪涚▼鏃跺皢浼?xì)閫氳繃璇ユ爣璁拌岀煡鏅撳叾瀹炰緥宸茬粡瀛樺湪錛屼粠鑰屼繚璇佽繘紼嬪湪緋葷粺涓彧鑳藉瓨鍦ㄤ竴涓疄渚嬨傚叿浣撳彲浠ラ噰鍙栧唴瀛樻槧灝勬枃浠躲佹湁鍚嶄簨浠墮噺銆佹湁鍚嶄簰鏂ラ噺浠ュ強(qiáng)鍏ㄥ眬鍏變韓鍙橀噺絳夊縐嶆柟娉曟潵瀹炵幇銆備笅闈㈠氨鍒嗗埆瀵瑰叾涓叿鏈変唬琛ㄦх殑鏈夊悕浜掓枼閲忓拰鍏ㄥ眬鍏變韓鍙橀噺榪欎袱縐嶆柟娉曡繘琛屼粙緇嶏細(xì)
// 鍒涘緩浜掓枼閲?/span>
HANDLE m_hMutex = CreateMutex(NULL, FALSE, "Sample07");
// 媯鏌ラ敊璇唬鐮?/span>
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
銆// 濡傛灉宸叉湁浜掓枼閲忓瓨鍦ㄥ垯閲婃斁鍙ユ焺騫跺浣嶄簰鏂ラ噺
銆CloseHandle(m_hMutex);
銆m_hMutex = NULL;
銆// 紼嬪簭閫鍑?/span>
銆return FALSE;
}
涓婇潰榪欐浠g爜婕旂ず浜嗘湁鍚嶄簰鏂ラ噺鍦ㄨ繘紼嬩簰鏂ヤ腑鐨勭敤娉曘備唬鐮佺殑鏍稿績鏄疌reateMutex錛堬級瀵規(guī)湁鍚嶄簰鏂ラ噺鐨勫垱寤恒侰reateMutex錛堬級鍑芥暟鍙敤鏉ュ垱寤轟竴涓湁鍚嶆垨鏃犲悕鐨勪簰鏂ラ噺瀵硅薄錛屽叾鍑芥暟鍘熷瀷涓猴細(xì)
HANDLE CreateMutex(
銆LPSECURITY_ATTRIBUTES lpMutexAttributes, // 鎸囧悜瀹夊叏灞炴х殑鎸囬拡
銆BOOL bInitialOwner, // 鍒濆鍖栦簰鏂ュ璞$殑鎵鏈夎?/span>
銆LPCTSTR lpName // 鎸囧悜浜掓枼瀵硅薄鍚嶇殑鎸囬拡
);
濡傛灉鍑芥暟鎴愬姛鎵ц錛屽皢榪斿洖涓涓簰鏂ラ噺瀵硅薄鐨勫彞鏌勩傚鏋滃湪CreateMutex錛堬級鎵ц鍓嶅凡緇忓瓨鍦ㄦ湁鐩稿悓鍚嶅瓧鐨勪簰鏂ラ噺錛屽嚱鏁板皢榪斿洖榪欎釜宸茬粡瀛樺湪浜掓枼閲忕殑鍙ユ焺錛屽茍涓斿彲浠ラ氳繃GetLastError錛堬級寰楀埌閿欒浠g爜ERROR_ALREADY_EXIST銆傚彲瑙侊紝閫氳繃瀵歸敊璇唬鐮丒RROR_ALREADY_EXIST鐨勬嫻嬪彲浠ュ疄鐜癈reateMutex錛堬級瀵硅繘紼嬬殑浜掓枼銆?/p>
寤虹珛浜掓枼浣擄紝鐢ㄦ潵鍚屾銆傚鏋滀竴涓嚎紼嬭幏鍙栦簡浜掓枼浣擄紝鍒欒鑾峰彇璇ヤ簰鏂ヤ綋鐨勭浜屼釜綰跨▼灝嗚鎸傝搗錛岀洿鍒扮涓涓嚎紼嬮噴鏀捐浜掓枼浣撱?
鍙傛暟
lpMutexAttributes
鎸囧悜涓涓猄ECURITY_ATTRIBUTES緇撴瀯鐨勬寚閽堬紝榪欎釜緇撴瀯鍐沖畾浜掓枼浣撳彞鏌勬槸鍚﹁瀛愯繘紼嬬戶鎵褲?nbsp;
bInitialOwner
甯冨皵綾誨瀷錛屽喅瀹氫簰鏂ヤ綋鐨勫垱寤鴻呮槸鍚︿負(fù)鎷ユ湁鑰?
lpName
鎸囧悜浜掓枼浣撳悕瀛楀瓧絎︿覆鐨勬寚閽堛備簰鏂ヤ綋鍙互鏈夊悕瀛椼?
浜掓枼浣撶殑濂藉鏄彲浠ュ湪榪涚▼闂村叡浜?/p>
蹇冨緱浣撲細(xì)錛?br> CreateMutex() 鐢ㄤ簬鏈夌嫭鍗犺姹傜殑紼嬪簭 (鍦ㄥ叾榪涚▼榪愯鏈熼棿涓嶅厑璁稿叾浠栦嬌鐢ㄦ绔彛璁懼鐨勭▼搴忚繍琛岋紝鎴栦笉鍏佽鍚屽悕紼嬪簭榪愯)銆傚鏈夊悓鍚嶇▼搴忚繍琛岋紝鍒欓氳繃 GetLastError錛堬級寰楀埌閿欒浠g爜 ERROR_ALREADY_EXIST銆?/p>
鍒氭墠鍙堟墽琛屼簡涓嬪緱鍑虹殑緇撴灉錛堢▼搴忓悕samp錛?br> 涓鑸儏鍐典笅錛氫竴榪涘叆璋冭瘯闃舵錛岃繘紼嬬鐞嗗櫒涓氨鍑虹幇浜唖amp榪涚▼錛屾墽琛屽埌CreateMutex鏃惰繑鍥炶繘紼嬪彞鏌勶紝鎵ц鍒癷f(GetLastError() == ERROR_ALREADY_EXISTS ) 榪涜鍒ゆ柇鏃訛紝璺寵繃涓嶆墽琛宨f涓殑鍐呭錛屾墍浠ヨ〃紺烘病鏈変簰鏂ャ?br> 璋冭瘯涔嬪墠鍏堣繍琛宒ebug涓殑samp.exe鍐嶈皟璇曪細(xì)涓榪涘叆璋冭瘯闃舵錛岃繘紼嬬鐞嗗櫒涓氨鍑虹幇浜嗕袱涓猻amp榪涚▼錛屾墽琛屽埌CreateMutex鏃惰繑鍥炶繘紼嬪彞鏌勶紝鎵ц鍒癷f(GetLastError() == ERROR_ALREADY_EXISTS ) 榪涜鍒ゆ柇鏃訛紝鎵цif涓殑鍐呭錛岃〃紺烘湁浜掓枼銆?/p>
榪欓噷涓昏鎬葷粨甯哥敤鐨?縐嶆帓搴忥紝鍒嗗埆鏄揩閫熸帓搴忥紝鍐掓場鎺掑簭錛堜篃鍙氦鎹㈡帓搴忥級錛岄夋嫨鎺掑簭錛宻hell鎺掑簭錛屾彃鍏ユ帓搴忋?o:p>
涓嬭竟鍒嗗埆浠嬬粛錛?o:p>
1蹇熸帓搴忥紝灝辨槸浠庝竴涓簭鍒椾腑闅忔剰鍙栦竴涓暟錛岀劧鍚庡鍓╀笅鐨勬暟榪涜鍒嗙被錛屽皬鐨勬斁鍒板乏杈癸紝澶х殑鏀懼埌鍙寵竟銆傚姝よ繘琛屼笅鍘葷煡閬撴渶鍚庛侼(n-1)/2.絀洪棿澶嶆潅搴︽槸o錛坣錛?
2鍐掓場鎺掑簭錛屽氨鏄粠絎竴涓暟寮濮嬪拰鍚庝竴涓暟姣旇緝錛岀劧鍚庝緷鎯呭喌浜ゆ崲錛岀劧鍚庡啀鐢ㄧ浜屼釜鍜岀涓変釜姣旇緝浜ゆ崲錛屽姝ゅ弽澶嶏紝鐩村埌鏈鍚庝竴涓備竴鐩磋繘琛宯杞氨鍙互瀹屾垚鎺掑簭銆?o:p>
3閫夋嫨鎺掑簭錛屽氨鏄皢涓涓簭鍒椾腑鐨勬渶灝忕殑鏀懼埌絎竴涓紝鐒跺悗鍐嶅皢鍓╀笅鐨勬暟鎹敤鐩稿悓鐨勬柟寮忓垎鍒斁鍒板悗涓浣嶃傚畠鐨勭┖闂村鏉傚害鏄疧(1).
4shell鎺掑簭錛屽氨鏄皢鏈変竴瀹氶棿闅旂殑鏁拌繘琛屾帓搴忥紝騫朵笖闂撮殧鍙樺皬錛屼篃灝辨槸寮濮嬫槸n/2,鐒跺悗緇х畫鍙樺皬錛屼竴鑸兘鏄互涓鍗婁負(fù)鏍囧噯錛岀洿鍒版渶鍚庨棿闅斿彧鏈?錛屼篃灝卞畬鎴愪簡鎺掑簭銆傞渶瑕佺殑絀洪棿澶嶆潅搴︽槸O(1).
5鎻掑叆鎺掑簭錛屽氨姣斿騫蟲椂鐜╃殑鎵戝厠鎺掞紝涓鑸暣鐞嗘帓鐨勬椂鍊欓渶瑕佸皢鎺掓帓搴忥紝褰撲綘鎷垮埌涓寮犳柊鎺掔殑鏃跺欙紝灝辮姣旇緝宸﹁竟鍜屽彸杈癸紝鍙湁鍦ㄥ乏鍙充腑闂寸殑閭d釜鍊肩殑鏃跺欐墠璇存槑鎺掑簭鎴愬姛銆傚畠闇瑕佺殑絀洪棿澶嶆潅搴︿篃鏄疧(1).
Ps:絀洪棿澶嶆潅搴﹀氨鏄渶瑕佸彟澶栧崰鐢ㄧ殑絀洪棿銆?o:p>
浠ヤ笂鎺掑簭涓紝鍙湁蹇熸帓搴忔槸O錛坣錛夛紝鍏朵粬閮芥槸O錛?錛夛紝鍥犱負(fù)鍙湁蹇熸帓搴忛渶瑕佸彟澶栧啀璧峰瓨鍌ㄧ┖闂達(dá)紝鑰屽叾浠栭兘鏄湪鍘熸潵絀洪棿涓鍔犱竴涓┖闂村氨鍙互銆?o:p>
鍖哄埆錛?/p>
1鍫嗙殑瀹歸噺姣旇緝澶э紝鏍堢殑瀹歸噺姣旇緝?yōu)畯銆?/p>
2鍫嗙浉褰撲簬涓涓叏灞鍙橀噺錛屽彲浠ヤ負(fù)鍚勭鍑芥暟浣跨敤錛屾爤涓鑸彧鏄負(fù)鍑芥暟鍐呴儴浣跨敤銆傚湪寤虹珛浜嗘柊鐨勫璞℃椂錛屽彲浠ヤ嬌鐢╪ew錛屼篃鍙互鐩存帴classtype a錛涘墠鑰呭氨鏄痭ew錛屽悗鑰呭氨鏄洿鎺ユ斁鍒頒簡鏍堜腑銆?/p>
3 鍫嗙殑鍙橀噺鍙互鍔ㄦ佸垎閰嶅拰閲婃斁 涓嶇敤浜嗗氨鏀句簡 鑺傜害鍐呭瓨
鏍堢殑鍐呭瓨鍙湁鍦ㄥ嚱鏁扮粨鏉熷悗鎵嶉噴鏀俱?/p>
2 閫氳繃鍗曚竴鎸囦護(hù)璋冪敤涓嶅悓鍑芥暟錛屽氨鏄鎬丳olymorphism,"ability to asume many forms" 铏氬嚱鏁版槸c錛嬶紜璇█polymorphism鎬ц川浠ュ強(qiáng)鍔ㄦ佽仈緙栫殑鍏抽敭
3 鏃㈢劧鎶借薄綾諱腑鐨勮櫄鍑芥暟涓嶆墦綆楄璋冪敤錛岄偅涔堝氨鎶婂畠璁劇疆鎴愮函铏氬嚱鏁般?
4 鎷ユ湁綰櫄鍑芥暟鑰呬負(fù)鎶借薄綾匯?
5 鎶借薄綾諱笉鑳戒駭鐢熷嚭瀵硅薄瀹炰綋錛屼絾鏄垜浠彲浠ユ嫢鏈夋寚鍚戞娊璞$被鐨勬寚閽堬紝浠ヤ究浜庢搷浣滄娊璞$被鐨勫悇涓淳鐢熺被銆?
6 铏氬嚱鏁版淳鐢熶笅鍘諱粛鏄櫄鍑芥暟錛屽彲浠ヤ笉鍐檝irtual銆?
涓句緥鍑芥暟妯″潡A錛屽嚱鏁版ā鍧桞錛屽鏋滃嚱鏁版ā鍧桞涓殑鏌愪釜鍑芥暟b瑕佸湪鍥哄畾鏃墮棿n璋冪敤鍑芥暟A涓殑鏌愪釜鍑芥暟a銆?榪欓噷棣栧厛鏄庣櫧鍝釜鏄洖璋冨嚱鏁幫紝榪欓噷鐨勫嚱鏁癮灝辨槸鍥炶皟鍑芥暟銆?
濡傛灉瑕佸畬鎴愯繖涓換鍔★紝灝辮鍦ㄥ嚱鏁版ā鍧桞涓鍔犱竴涓嚱鏁幫紝鍙敞鍐屽嚱鏁癱錛屽綋鏃墮棿婊¤凍浜嗚瀹氱殑n錛屽氨瑕佽皟鐢ˋ涓殑a錛?B涓殑娉ㄥ唽鍑芥暟c騫朵笉鐭ラ亾瑕佹墽琛屼粈涔堟搷浣滐紝瀹冨彧鏄礋璐e湪涓瀹氱殑鏃舵満璋冪敤鍑芥暟a銆?
c鍑芥暟涓鑸瓨鏀句簡鍑芥暟a鐨勬寚閽堬紝浠ヤ究璋冪敤錛岃繕鏈夊氨鏄畾鏃剁殑鏃墮棿鍙傛暟銆?/p>
榪欓噷闇瑕佹敞鎰忓嚑鐐癸細(xì)
1鍑芥暟妯″潡A鍜屽嚱鏁版ā鍧桞蹇呴』鍦ㄥ悓涓涓墿鐞嗗湴鍧鍧椾腑錛屽鏋滄槸鍦ㄤ笉鍚岀殑鐗╃悊鍦板潃鐨勭▼搴忔ā鍧楁槸涓嶅彲浠ヤ嬌鐢ㄧ殑銆?/p>
2涓鑸簲鐢ㄥ埌瀹氭椂鐨勮皟鐢ㄦ煇涓ā鍧楃殑鍑芥暟
3琚皟鐢ㄧ殑鍑芥暟a鍙互娌℃湁瀹炵幇
涓句釜渚嬪瓙錛屽氨鏄紝涔扮背a錛岃佹澘b涓嶅湪錛屼綘鐣欑數(shù)璇漜錛屼粬瑙佺數(shù)璇濆彿鐮佹墦緇欎綘銆?/p>
鍐呭瓨鍒嗛厤鏂瑰紡鏈変笁縐嶏細(xì)
錛?錛?浠?font style="BACKGROUND-COLOR: #ff00ff">闈欐佸瓨鍌ㄥ尯鍩熷垎閰嶃傚唴瀛樺湪紼嬪簭緙栬瘧鐨勬椂鍊欏氨宸茬粡鍒嗛厤濂斤紝榪欏潡鍐呭瓨鍦ㄧ▼搴忕殑鏁翠釜榪愯鏈熼棿閮藉瓨鍦ㄣ?渚嬪鍏ㄥ眬鍙橀噺static鍙橀噺銆?br>錛?錛?鍦?font style="BACKGROUND-COLOR: #ff00ff">鏍堜笂鍒涘緩銆傚湪鎵ц鍑芥暟鏃訛紝鍑芥暟鍐呭眬閮ㄥ彉閲忕殑瀛樺偍鍗曞厓閮藉彲浠ュ湪鏍堜笂鍒涘緩錛屽嚱鏁版墽琛岀粨鏉熸椂榪欎簺瀛樺偍 鍗曞厓鑷姩琚噴鏀俱傛爤鍐呭瓨 鍒嗛厤榪愮畻鍐呯疆浜庡鐞嗗櫒鐨勬寚浠ら泦涓紝鏁堢巼寰堥珮錛屼絾鏄垎閰嶇殑鍐呭瓨瀹歸噺鏈夐檺銆?br>錛?錛?浠?font style="BACKGROUND-COLOR: #ff00ff">鍫嗕笂鍒嗛厤錛屼害縐板姩鎬佸唴瀛樺垎閰嶃傜▼搴忓湪榪愯鐨勬椂鍊欑敤malloc鎴杗ew鐢寵浠繪剰澶氬皯鐨勫唴瀛?/font>錛岀▼搴忓憳鑷繁璐熻矗鍦ㄤ綍鏃剁敤free鎴杁elete閲婃斁鍐呭瓨銆傚姩鎬佸唴瀛樼殑鐢熷瓨鏈熺敱鎴戜滑鍐沖畾錛屼嬌鐢ㄩ潪甯哥伒媧伙紝浣嗛棶棰樹篃鏈澶氥?/font>
甯歌鐨勫唴瀛橀敊璇強(qiáng)鍏跺絳?br>
-------------------------------------------------------------------------
鍙戠敓鍐呭瓨閿欒鏄歡闈炲父楹葷儲鐨勪簨鎯呫傜紪璇戝櫒涓嶈兘鑷姩鍙戠幇榪欎簺閿欒錛岄氬父鏄湪紼嬪簭榪愯鏃舵墠鑳芥崟鎹夊埌銆傝岃繖浜涢敊璇ぇ澶氭病鏈夋槑鏄劇殑鐥囩姸錛屾椂闅愭椂鐜幫紝澧炲姞浜嗘敼閿欑殑闅懼害銆傛湁鏃剁敤鎴鋒掓皵鍐插啿鍦版妸浣犳壘鏉ワ紝紼嬪簭鍗存病鏈夊彂鐢熶換浣曢棶棰橈紝浣犱竴璧幫紝閿欒鍙堝彂浣滀簡銆?/font>
甯歌鐨勫唴瀛橀敊璇強(qiáng)鍏跺絳栧涓嬶細(xì)
1>鍐呭瓨鍒嗛厤鏈垚鍔燂紝鍗翠嬌鐢ㄤ簡瀹冦?/font>
------------------------------------------
緙栫▼鏂版墜甯哥姱榪欑閿欒錛屽洜涓轟粬浠病鏈夋剰璇嗗埌鍐呭瓨鍒嗛厤浼?xì)涓嶆垚鍔熴傚父鐢ㄨВ鍐沖姙娉曟槸錛屽湪浣跨敤鍐呭瓨涔嬪墠媯 鎸囬拡鏄惁涓篘ULL銆?font style="BACKGROUND-COLOR: #0080ff">濡傛灉鎸囬拡p鏄嚱鏁扮殑鍙傛暟錛岄偅涔堝湪鍑芥暟鐨勫叆鍙e鐢╝ssert(p!=NULL)榪涜媯鏌ャ?/font>濡傛灉 鏄敤malloc鎴杗ew鏉ョ敵璇峰唴瀛橈紝搴旇鐢╥f(p==NULL) 鎴杋f(p=NULL)榪涜闃查敊澶勭悊銆?/font>
2>鍐呭瓨鍒嗛厤铏界劧鎴愬姛錛屼絾鏄皻鏈垵濮嬪寲灝卞紩鐢ㄥ畠
------------------------------------------
鐘繖縐嶉敊璇富瑕佹湁涓や釜璧峰洜錛氫竴鏄病鏈夊垵濮嬪寲鐨勮蹇碉紱浜屾槸璇互涓哄唴瀛樼殑緙虹渷鍒濆煎叏涓洪浂錛屽鑷村紩鐢ㄥ垵 閿欒錛堜緥濡傛暟緇勶級銆?br>鍐呭瓨鐨勭己鐪佸垵鍊肩┒绔熸槸浠涔堝茍娌℃湁緇熶竴鐨勬爣鍑嗭紝灝界鏈変簺鏃跺欎負(fù)闆跺鹼紝鎴戜滑瀹佸彲淇″叾鏃犱笉鍙俊鍏舵湁銆?font style="BACKGROUND-COLOR: #0080ff">鎵 浠ユ棤璁虹敤浣曠鏂瑰紡鍒涘緩鏁扮粍錛岄兘鍒繕浜嗚祴鍒濆鹼紝鍗充究鏄祴闆跺間篃涓嶅彲鐪佺暐錛屼笉瑕佸珜楹葷儲銆?/font>
3>鍐呭瓨鍒嗛厤鎴愬姛騫朵笖宸茬粡鍒濆鍖栵紝浣嗘搷浣滆秺榪囦簡鍐呭瓨鐨勮竟鐣屻?/font>
------------------------------------------
渚嬪鍦ㄤ嬌鐢ㄦ暟緇勬椂緇忓父鍙戠敓涓嬫爣"澶?"鎴栬?灝?"鐨勬搷浣溿傜壒鍒槸鍦╢or寰幆璇彞涓紝寰幆嬈℃暟寰堝鏄撴悶閿欙紝瀵艱嚧鏁扮粍鎿嶄綔瓚婄晫銆?/font>
------------------------------------------
4>蹇樿浜嗛噴鏀懼唴瀛橈紝閫犳垚鍐呭瓨娉勯湶銆?/font>
鍚湁榪欑閿欒鐨勫嚱鏁版瘡琚皟鐢ㄤ竴嬈″氨涓㈠け涓鍧楀唴瀛樸傚垰寮濮嬫椂緋葷粺鐨勫唴瀛樺厖瓚籌紝浣犵湅涓嶅埌閿欒銆傜粓鏈変竴嬈$▼搴忕獊鐒舵鎺夛紝緋葷粺鍑虹幇鎻愮ず錛氬唴瀛樿楀敖銆傚姩鎬佸唴瀛樼殑鐢寵涓庨噴鏀懼繀欏婚厤瀵癸紝紼嬪簭涓璵alloc涓巉ree鐨勪嬌鐢ㄦ鏁頒竴瀹氳鐩稿悓錛屽惁鍒欒偗瀹氭湁閿欒錛坣ew/delete鍚岀悊錛夈?/font>
5>閲婃斁浜嗗唴瀛樺嵈緇х畫浣跨敤瀹冦?/font>
------------------------------------------
鏈変笁縐嶆儏鍐碉細(xì)
錛?錛?
紼嬪簭涓殑瀵硅薄璋冪敤鍏崇郴榪囦簬澶嶆潅錛屽疄鍦ㄩ毦浠ユ悶娓呮鏌愪釜瀵硅薄絀剁珶鏄惁宸茬粡閲婃斁浜嗗唴瀛橈紝姝ゆ椂搴旇閲嶆柊璁捐鏁版嵁緇撴瀯錛屼粠鏍規(guī)湰涓婅В鍐沖璞$鐞嗙殑娣蜂貢灞闈€?/td>
錛?錛?
鍑芥暟鐨剅eturn璇彞鍐欓敊浜嗭紝娉ㄦ剰涓嶈榪斿洖鎸囧悜"鏍堝唴瀛?鐨?鎸囬拡"鎴栬?寮曠敤"錛屽洜涓鴻鍐呭瓨鍦ㄥ嚱鏁頒綋緇撴潫鏃惰鑷姩閿姣併?/td>
錛?錛?
浣跨敤free鎴杁elete閲婃斁浜嗗唴瀛樺悗錛屾病鏈夊皢鎸囬拡璁劇疆涓篘ULL銆傚鑷翠駭鐢?閲庢寚閽?銆?/td>
銆愯鍒?銆戠敤malloc鎴杗ew鐢寵鍐呭瓨涔嬪悗錛屽簲璇ョ珛鍗蟲鏌ユ寚閽堝兼槸鍚︿負(fù)NULL銆傞槻姝嬌鐢ㄦ寚閽堝間負(fù)NULL鐨勫唴瀛樸?br>銆愯鍒?銆?font style="BACKGROUND-COLOR: #0080ff">涓嶈蹇樿涓烘暟緇勫拰鍔ㄦ佸唴瀛樿祴鍒濆?/font>銆傞槻姝㈠皢鏈鍒濆鍖栫殑鍐呭瓨浣滀負(fù)鍙沖間嬌鐢ㄣ?br>銆愯鍒?銆戦伩鍏嶆暟緇勬垨鎸囬拡鐨勪笅鏍囪秺鐣岋紝鐗瑰埆瑕佸綋蹇冨彂鐢?澶?"鎴栬?灝?"鎿嶄綔銆?br>銆愯鍒?銆戝姩鎬佸唴瀛樼殑鐢寵涓庨噴鏀懼繀欏婚厤瀵癸紝闃叉鍐呭瓨娉勬紡銆?br>銆愯鍒?銆?font style="BACKGROUND-COLOR: #0080ff">鐢╢ree鎴杁elete閲婃斁浜嗗唴瀛樹箣鍚庯紝绔嬪嵆灝嗘寚閽堣緗負(fù)NULL錛岄槻姝駭鐢?閲庢寚閽?銆?/font>
-------------------------------------------------------------------------
鎸囬拡涓庢暟緇勭殑瀵規(guī)瘮
C++/C紼嬪簭涓紝鎸囬拡鍜屾暟緇勫湪涓嶅皯鍦版柟鍙互鐩鎬簰鏇挎崲鐫鐢紝璁╀漢浜х敓涓縐嶉敊瑙夛紝浠ヤ負(fù)涓よ呮槸絳変環(huán)鐨勩?br>
鏁扮粍
-------------
鏁扮粍瑕佷箞鍦?font style="BACKGROUND-COLOR: #ffff80">闈欐佸瓨鍌ㄥ尯琚垱寤猴紙濡傚叏灞鏁扮粍錛夛紝瑕佷箞鍦?font style="BACKGROUND-COLOR: #ffff80">鏍堜笂琚垱寤?/font>銆傛暟緇勫悕瀵瑰簲鐫錛堣屼笉鏄寚鍚戯級涓鍧楀唴瀛橈紝鍏?font style="BACKGROUND-COLOR: #ff0000">鍦板潃涓庡閲?/font>鍦ㄧ敓鍛芥湡鍐?font style="BACKGROUND-COLOR: #ff0000">淇濇寔涓嶅彉錛屽彧鏈?font style="BACKGROUND-COLOR: #ff0000">鏁扮粍鐨勫唴瀹瑰彲浠ユ敼鍙?/font>銆?/font>
鎸囬拡
--------------
鎸囬拡鍙互闅忔椂鎸囧悜浠繪剰綾誨瀷鐨勫唴瀛樺潡錛屽畠鐨勭壒寰佹槸"鍙彉"錛屾墍浠ユ垜浠父鐢ㄦ寚閽堟潵鎿嶄綔鍔ㄦ佸唴瀛樸傛寚閽堣繙姣旀暟緇勭伒媧伙紝浣嗕篃鏇村嵄闄┿?/font>
涓嬮潰浠ュ瓧絎︿覆涓轟緥姣旇緝鎸囬拡涓庢暟緇勭殑鐗規(guī)с?/font>
1.淇敼鍐呭
------------------------------------------
紺轟緥1涓紝瀛楃鏁扮粍a鐨勫閲忔槸6涓瓧絎︼紝鍏跺唴瀹逛負(fù)hello\0銆俛鐨勫唴瀹瑰彲浠ユ敼鍙橈紝濡俛[0]= 'X'銆?br>鎸囬拡p鎸囧悜甯擱噺瀛楃涓?world"錛堜綅浜庨潤鎬佸瓨鍌ㄥ尯錛屽唴瀹逛負(fù)world\0錛夛紝甯擱噺瀛楃涓茬殑鍐呭鏄笉鍙互琚慨鏀圭殑銆?br>浠庤娉曚笂鐪嬶紝緙栬瘧鍣ㄥ茍涓嶈寰楄鍙[0]= ‘X'鏈変粈涔堜笉濡ワ紝浣嗘槸璇ヨ鍙ヤ紒鍥句慨鏀瑰父閲忓瓧絎︿覆鐨勫唴瀹硅屽鑷磋繍琛岄敊璇?br>
紺轟緥7-3-1 淇敼鏁扮粍鍜屾寚閽堢殑鍐呭
------------------------------
char a[] = "hello";
a[0] = 'X';
cout << a << endl;
char *p = "world"; // 娉ㄦ剰p鎸囧悜甯擱噺瀛楃涓?nbsp;
p[0] = 'X'; // 緙栬瘧鍣ㄤ笉鑳藉彂鐜拌閿欒cout << p << endl;
2.鍐呭澶嶅埗涓庢瘮杈?br>------------------------------------------
鏁扮粍澶嶅埗
--------
涓嶈兘瀵規(guī)暟緇勫悕榪涜鐩存帴澶嶅埗涓庢瘮杈冦傜ず渚?涓紝鑻ユ兂鎶婃暟緇刟鐨勫唴瀹瑰鍒剁粰鏁扮粍b錛屼笉鑳界敤璇彞 b = a 錛屽惁鍒欏皢浜х敓緙栬瘧閿欒銆傚簲璇ョ敤鏍囧噯搴撳嚱鏁?font style="BACKGROUND-COLOR: #0080ff">strcpy榪涜澶嶅埗銆傚悓鐞嗭紝姣旇緝b鍜宎鐨勫唴瀹規(guī)槸鍚︾浉鍚岋紝涓嶈兘鐢╥f(b==a) 鏉ュ垽鏂紝搴旇鐢?font style="BACKGROUND-COLOR: #0080ff">鏍囧噯搴撳嚱鏁皊trcmp榪涜姣旇緝銆?/font>
鎸囬拡澶嶅埗
--------
璇彞p = a 騫朵笉鑳芥妸a鐨勫唴瀹瑰鍒舵寚閽坧錛岃屾槸鎶奱鐨勫湴鍧璧嬬粰浜唒銆傝鎯沖鍒禷鐨勫唴瀹癸紝鍙互鍏堢敤搴撳嚱鏁癿alloc涓簆鐢寵涓鍧楀閲忎負(fù)strlen(a)+1涓瓧絎︾殑鍐呭瓨錛屽啀鐢╯trcpy榪涜瀛楃涓插鍒?/font>銆傚悓鐞嗭紝璇彞if(p==a) 姣旇緝鐨勪笉鏄唴瀹硅屾槸鍦板潃錛屽簲璇ョ敤搴撳嚱鏁皊trcmp鏉ユ瘮杈冦?/font>
紺轟緥2 鏁扮粍鍜屾寚閽堢殑鍐呭澶嶅埗涓庢瘮杈?br>-----------------------------------
// 鏁扮粍...
char a[] = "hello";
char b[10];
strcpy(b, a); //涓嶈兘鐢╞ = a;
if(strcmp(b, a) == 0) // 涓嶈兘鐢?if (b == a)...
// 鎸囬拡...
int len = strlen(a);
char *p = (char *)malloc(sizeof(char)*(len+1));
strcpy(p,a); // 涓嶈鐢?p = a;
if(strcmp(p, a) == 0) // 涓嶈鐢?if (p == a)...
3 璁$畻鍐呭瓨瀹歸噺
------------------------------------------
鏁扮粍
----
鐢ㄨ繍綆楃sizeof鍙互璁$畻鍑烘暟緇勭殑瀹歸噺錛堝瓧鑺傛暟錛夈?br>紺轟緥3涓紝sizeof(a)鐨勫兼槸12錛堟敞鎰忓埆蹇樹簡'\0'錛夈?/font>
鎸囬拡
----
鎸囬拡p鎸囧悜a錛屼絾鏄痵izeof(p)鐨勫煎嵈鏄?銆傝繖鏄洜涓簊izeof(p)寰楀埌鐨勬槸涓涓寚閽堝彉閲忕殑瀛楄妭鏁幫紝
鐩稿綋浜巗izeof(char*)錛岃屼笉鏄痯鎵鎸囩殑鍐呭瓨瀹歸噺銆?/font>
C++/C璇█娌℃湁鍔炴硶鐭ラ亾鎸囬拡鎵鎸囩殑鍐呭瓨瀹歸噺錛岄櫎闈炲湪鐢寵鍐呭瓨鏃惰浣忓畠銆?/font>
娉ㄦ剰
----
褰撴暟緇勪綔涓哄嚱鏁扮殑鍙傛暟榪涜浼犻掓椂錛岃鏁扮粍鑷姩閫鍖栦負(fù)鍚岀被鍨嬬殑鎸囬拡銆?/font>
紺轟緥3涓紝涓嶈鏁扮粍a鐨勫閲忔槸澶氬皯錛宻izeof(a)濮嬬粓絳変簬sizeof(char *)銆?br>
紺轟緥3 璁$畻鏁扮粍鍜屾寚閽堢殑鍐呭瓨瀹歸噺
-----------------------------
char a[] = "hello world";
char *p = a; cout<< sizeof(a) << endl;// 12瀛楄妭
cout<< sizeof(p) << endl;// 4瀛楄妭
紺轟緥3錛坆錛?鏁扮粍閫鍖栦負(fù)鎸囬拡
-----------------------------
void Func(char a[100])
{
cout<< sizeof(a) << endl;// 4瀛楄妭鑰屼笉鏄?00瀛楄妭
}
4銆佹寚閽堝弬鏁版槸濡備綍浼犻掑唴瀛樼殑錛?br>------------------------------------------
濡傛灉鍑芥暟鐨勫弬鏁版槸涓涓寚閽堬紝涓嶈鎸囨湜鐢ㄨ鎸囬拡鍘葷敵璇峰姩鎬佸唴瀛樸?br>紺轟緥4-1涓紝Test鍑芥暟鐨勮鍙etMemory(str, 200)騫舵病鏈変嬌str鑾峰緱鏈熸湜鐨勫唴瀛橈紝str渚濇棫鏄疦ULL錛屼負(fù)浠涔堬紵
紺轟緥4-1 璇曞浘鐢ㄦ寚閽堝弬鏁扮敵璇峰姩鎬佸唴瀛?br>----------------------------------
void GetMemory(char *p, int num)
{
p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str, 100);// str 浠嶇劧涓?NULL
strcpy(str, "hello"); // 榪愯閿欒
}
姣涚梾鍑哄湪鍑芥暟GetMemory涓?font style="BACKGROUND-COLOR: #ff00ff">緙栬瘧鍣ㄦ繪槸瑕佷負(fù)鍑芥暟鐨勬瘡涓弬鏁板埗浣滀復(fù)鏃跺壇鏈?/font>錛?br>鎸囬拡鍙傛暟p鐨勫壇鏈槸 _p錛岀紪璇戝櫒浣?_p = p銆傚鏋滃嚱鏁頒綋鍐呯殑紼嬪簭淇敼浜哶p鐨勫唴瀹癸紝
灝卞鑷村弬鏁皃鐨勫唴瀹逛綔鐩稿簲鐨勪慨鏀廣傝繖灝辨槸鎸囬拡鍙互鐢ㄤ綔杈撳嚭鍙傛暟鐨勫師鍥犮?br>鍦ㄦ湰渚嬩腑錛宊p鐢寵浜嗘柊鐨勫唴瀛橈紝鍙槸鎶奯p鎵鎸囩殑鍐呭瓨鍦板潃鏀瑰彉浜嗭紝浣嗘槸p涓濇鏈彉銆?br>鎵浠ュ嚱鏁癎etMemory騫朵笉鑳借緭鍑轟換浣曚笢瑗褲?br>浜嬪疄涓婏紝姣忔墽琛屼竴嬈etMemory灝變細(xì)娉勯湶涓鍧楀唴瀛橈紝鍥犱負(fù)娌℃湁鐢╢ree閲婃斁鍐呭瓨銆?/font>
濡傛灉闈炲緱瑕佺敤鎸囬拡鍙傛暟鍘葷敵璇峰唴瀛橈紝閭d箞搴旇鏀圭敤"鎸囧悜鎸囬拡鐨勬寚閽?錛岃紺轟緥4-2銆?/font>
紺轟緥4-2鐢ㄦ寚鍚戞寚閽堢殑鎸囬拡鐢寵鍔ㄦ佸唴瀛?br>------------------------------------
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
void Test2(void)
{
char *str = NULL;
GetMemory2(&str, 100); // 娉ㄦ剰鍙傛暟鏄?&str錛岃屼笉鏄痵tr
strcpy(str, "hello");
cout<< str << endl;
free(str);
}
鐢變簬"鎸囧悜鎸囬拡鐨勬寚閽?榪欎釜姒傚康涓嶅鏄撶悊瑙o紝鎴戜滑鍙互鐢ㄥ嚱鏁拌繑鍥炲兼潵浼犻掑姩鎬佸唴瀛樸?br>榪欑鏂規(guī)硶鏇村姞綆鍗曪紝瑙佺ず渚?-3銆?/font>
紺轟緥4-3 鐢ㄥ嚱鏁拌繑鍥炲兼潵浼犻掑姩鎬佸唴瀛?br>-----------------------------------
char *GetMemory3(int num)
{
char *p = (char *)malloc(sizeof(char) * num);
return p;
}
void Test3(void)
{
char *str = NULL;
str = GetMemory3(100);
strcpy(str,"hello");
cout<< str << endl;
free(str);
}
鐢ㄥ嚱鏁拌繑鍥炲兼潵浼犻掑姩鎬佸唴瀛樿繖縐嶆柟娉曡櫧鐒跺ソ鐢紝浣嗘槸甯稿父鏈変漢鎶妑eturn璇彞鐢ㄩ敊浜嗐傝繖閲屽己璋冧笉瑕佺敤return璇彞榪斿洖鎸囧悜"鏍堝唴瀛?鐨勬寚閽堬紝鍥犱負(fù)璇ュ唴瀛樺湪鍑芥暟緇撴潫鏃惰嚜鍔ㄦ秷浜★紝瑙佺ず渚?-4銆?/p>
紺轟緥4-4 return璇彞榪斿洖鎸囧悜"鏍堝唴瀛?鐨勬寚閽?br>--------------------------------------------
char *GetString(void)
{
char p[] = "hello world";
return p;// 緙栬瘧鍣ㄥ皢鎻愬嚭璀﹀憡
}
void Test4(void)
{
char *str = NULL;str = GetString();// str 鐨勫唴瀹規(guī)槸鍨冨溇
cout<< str << endl;
}
鐢ㄨ皟璇曞櫒閫愭璺熻釜Test4錛屽彂鐜版墽琛宻tr = GetString璇彞鍚巗tr涓嶅啀鏄疦ULL鎸囬拡錛?br>浣嗘槸str鐨勫唴瀹逛笉鏄?hello world"鑰屾槸鍨冨溇銆?/p>
濡傛灉鎶婄ず渚?-4鏀瑰啓鎴愮ず渚?-5錛屼細(xì)鎬庝箞鏍鳳紵
紺轟緥4-5 return璇彞榪斿洖甯擱噺瀛楃涓?br>-----------------------------------
char *GetString2(void)
{
char *p = "hello world";
return p;
}
void Test5(void)
{
char *str = NULL;
str = GetString2();
cout<< str << endl;
}
鍑芥暟Test5榪愯铏界劧涓嶄細(xì)鍑洪敊錛屼絾鏄嚱鏁癎etString2鐨勮璁℃蹇靛嵈鏄敊璇殑銆?br>鍥犱負(fù)GetString2鍐呯殑"hello world"鏄父閲忓瓧絎︿覆錛屼綅浜庨潤鎬佸瓨鍌ㄥ尯錛屽畠鍦ㄧ▼搴忕敓鍛芥湡鍐呮亽瀹氫笉鍙樸?br>鏃犺浠涔堟椂鍊欒皟鐢℅etString2錛屽畠榪斿洖鐨勫緇堟槸鍚屼竴涓?鍙"鐨勫唴瀛樺潡銆?/p>
5 free鍜宒elete鎶婃寚閽堟庝箞鍟︼紵 紺轟緥5 p鎴愪負(fù)閲庢寚閽?br>-------------------- 6 鍔ㄦ佸唴瀛樹細(xì)琚嚜鍔ㄩ噴鏀懼悧錛?br>------------------------------------------ 紺轟緥7-6 璇曞浘璁╁姩鎬佸唴瀛樿嚜鍔ㄩ噴鏀?br>------------------------------ 7 鏉滅粷"閲庢寚閽? "閲庢寚閽?鐨勬垚鍥犱富瑕佹湁涓ょ錛?/p>
錛?錛夋寚閽堝彉閲忔病鏈夎鍒濆鍖栥備換浣曟寚閽堝彉閲忓垰琚垱寤烘椂涓嶄細(xì)鑷姩鎴愪負(fù)NULL鎸囬拡錛?br>瀹冪殑緙虹渷鍊兼槸闅忔満鐨勶紝瀹冧細(xì)涔辨寚涓姘斻傛墍浠ワ紝鎸囬拡鍙橀噺鍦ㄥ垱寤虹殑鍚屾椂搴斿綋琚垵濮嬪寲錛?br>瑕佷箞灝嗘寚閽堣緗負(fù)NULL錛岃涔堣瀹冩寚鍚戝悎娉曠殑鍐呭瓨銆備緥濡?br>char *p = NULL; 錛?錛夋寚閽坧琚玣ree鎴栬卍elete涔嬪悗錛屾病鏈夌疆涓篘ULL錛岃浜鴻浠ヤ負(fù)p鏄釜鍚堟硶鐨勬寚閽堛傚弬瑙?.5鑺傘?/p>
錛?錛夋寚閽堟搷浣滆秴瓚婁簡鍙橀噺鐨勪綔鐢ㄨ寖鍥淬傝繖縐嶆儏鍐佃浜洪槻涓嶈儨闃詫紝紺轟緥紼嬪簭濡備笅錛?br>class A void Test(void) 鍑芥暟Test鍦ㄦ墽琛岃鍙->Func()鏃訛紝瀵硅薄a宸茬粡娑堝け錛岃宲鏄寚鍚慳鐨勶紝鎵浠灝辨垚浜?閲庢寚閽?銆?br>浣嗗鎬殑鏄垜榪愯榪欎釜紼嬪簭鏃跺眳鐒舵病鏈夊嚭閿欙紝榪欏彲鑳戒笌緙栬瘧鍣ㄦ湁鍏熾?/p>
8 鏈変簡malloc/free涓轟粈涔堣繕瑕乶ew/delete 錛?br>------------------------------------------ 瀵逛簬闈炲唴閮ㄦ暟鎹被鍨嬬殑瀵硅薄鑰岃█錛屽厜鐢╩aloc/free鏃犳硶婊¤凍鍔ㄦ佸璞$殑瑕佹眰銆?br>瀵硅薄鍦ㄥ垱寤虹殑鍚屾椂瑕佽嚜鍔ㄦ墽琛屾瀯閫犲嚱鏁幫紝瀵硅薄鍦ㄦ秷浜′箣鍓嶈鑷姩鎵ц鏋愭瀯鍑芥暟銆?br>鐢變簬malloc/free鏄簱鍑芥暟鑰屼笉鏄繍綆楃錛屼笉鍦ㄧ紪璇戝櫒鎺у埗鏉冮檺涔嬪唴錛?br>涓嶈兘澶熸妸鎵ц鏋勯犲嚱鏁板拰鏋愭瀯鍑芥暟鐨勪換鍔″己鍔犱簬malloc/free銆?br> 綆楃delete銆傛敞鎰弉ew/delete涓嶆槸搴撳嚱鏁般?br>鎴戜滑鍏堢湅涓鐪媘alloc/free鍜宯ew/delete濡備綍瀹炵幇瀵硅薄鐨勫姩鎬佸唴瀛樼鐞嗭紝瑙佺ず渚?銆?/p>
紺轟緥8 鐢╩alloc/free鍜宯ew/delete濡備綍瀹炵幇瀵硅薄鐨勫姩鎬佸唴瀛樼鐞?br>------------------------------------------------------------- 綾籓bj鐨勫嚱鏁癐nitialize妯℃嫙浜嗘瀯閫犲嚱鏁扮殑鍔熻兘錛屽嚱鏁癉estroy妯℃嫙浜嗘瀽鏋勫嚱鏁扮殑鍔熻兘銆?br>鍑芥暟UseMallocFree涓紝鐢變簬malloc/free涓嶈兘鎵ц鏋勯犲嚱鏁頒笌鏋愭瀯鍑芥暟錛?br>蹇呴』璋冪敤鎴愬憳鍑芥暟Initialize鍜孌estroy鏉ュ畬鎴愬垵濮嬪寲涓庢竻闄ゅ伐浣溿?br>鍑芥暟UseNewDelete鍒欑畝鍗曞緱澶氥?/p>
鎵浠ユ垜浠笉瑕佷紒鍥劇敤malloc/free鏉ュ畬鎴愬姩鎬佸璞$殑鍐呭瓨綆$悊錛屽簲璇ョ敤new/delete銆?br>鐢變簬鍐呴儴鏁版嵁綾誨瀷鐨?瀵硅薄"娌℃湁鏋勯犱笌鏋愭瀯鐨勮繃紼嬶紝瀵瑰畠浠岃█malloc/free鍜宯ew/delete鏄瓑浠風(fēng)殑銆?br> 濡傛灉鐢╢ree閲婃斁"new鍒涘緩鐨勫姩鎬佸璞?錛岄偅涔堣瀵硅薄鍥犳棤娉曟墽琛屾瀽鏋勫嚱鏁拌屽彲鑳藉鑷寸▼搴忓嚭閿欍?br>濡傛灉鐢╠elete閲婃斁"malloc鐢寵鐨勫姩鎬佸唴瀛?錛岀悊璁轟笂璁茬▼搴忎笉浼?xì)鍑洪敊锛屼絾鏄绋嬪簭鐨勫彲璇绘у緢宸?br>鎵浠ew/delete蹇呴』閰嶅浣跨敤錛宮alloc/free涔熶竴鏍楓?/p>
9 鍐呭瓨鑰楀敖鎬庝箞鍔烇紵 錛?錛夊垽鏂寚閽堟槸鍚︿負(fù)NULL錛屽鏋滄槸鍒欓┈涓婄敤return璇彞緇堟鏈嚱鏁般備緥濡傦細(xì) 錛?錛夊垽鏂寚閽堟槸鍚︿負(fù)NULL錛屽鏋滄槸鍒欓┈涓婄敤exit(1)緇堟鏁翠釜紼嬪簭鐨勮繍琛屻備緥濡傦細(xì) 錛?錛変負(fù)new鍜宮alloc璁劇疆寮傚父澶勭悊鍑芥暟銆?/p>
渚嬪Visual C++鍙互鐢╛set_new_hander鍑芥暟涓簄ew璁劇疆鐢ㄦ埛鑷繁瀹氫箟鐨勫紓甯稿鐞嗗嚱鏁幫紝 涓婅堪錛?錛夛紙2錛夋柟寮忎嬌鐢ㄦ渶鏅亶銆傚鏋滀竴涓嚱鏁板唴鏈夊澶勯渶瑕佺敵璇峰姩鎬佸唴瀛橈紝 寰堝浜轟笉蹇嶅績鐢╡xit(1)錛岄棶錛?涓嶇紪鍐欏嚭閿欏鐞嗙▼搴忥紝璁╂搷浣滅郴緇熻嚜宸辮В鍐寵涓嶈錛?
------------------------------------------
鍒湅free鍜宒elete鐨勫悕瀛楁伓鐙犵嫚鐨勶紙灝ゅ叾鏄痙elete錛夛紝
瀹冧滑鍙槸鎶婃寚閽堟墍鎸囩殑鍐呭瓨緇欓噴鏀炬帀錛屼絾騫舵病鏈夋妸鎸囬拡鏈韓騫叉帀銆?/font>
鐢ㄨ皟璇曞櫒璺熻釜紺轟緥5錛屽彂鐜版寚閽坧琚玣ree浠ュ悗鍏跺湴鍧浠嶇劧涓嶅彉錛堥潪NULL錛夛紝
鍙槸璇ュ湴鍧瀵瑰簲鐨勫唴瀛樻槸鍨冨溇錛宲鎴愪簡"閲庢寚閽?銆?br>濡傛灉姝ゆ椂涓嶆妸p璁劇疆涓篘ULL錛屼細(xì)璁╀漢璇互涓簆鏄釜鍚堟硶鐨勬寚閽堛?br>濡傛灉紼嬪簭姣旇緝闀匡紝鎴戜滑鏈夋椂璁頒笉浣弍鎵鎸囩殑鍐呭瓨鏄惁宸茬粡琚噴鏀撅紝
鍦ㄧ戶緇嬌鐢╬涔嬪墠錛岄氬父浼?xì)鐢ㄨ鍙f (p !=NULL)榪涜闃查敊澶勭悊銆?br>寰堥仐鎲撅紝姝ゆ椂if璇彞璧蜂笉鍒伴槻閿欎綔鐢紝鍥犱負(fù)鍗充究p涓嶆槸NULL鎸囬拡錛?br>瀹冧篃涓嶆寚鍚戝悎娉曠殑鍐呭瓨鍧椼?/p>
char *p = (char *) malloc(100);
strcpy(p, "hello");
free(p); // p 鎵鎸囩殑鍐呭瓨琚噴鏀撅紝浣嗘槸p鎵鎸囩殑鍦板潃浠嶇劧涓嶅彉 ...
if(p != NULL) // 娌℃湁璧峰埌闃查敊浣滅敤
{ strcpy(p, "world"); // 鍑洪敊
}
鍑芥暟浣撳唴鐨勫眬閮ㄥ彉閲忓湪鍑芥暟緇撴潫鏃惰嚜鍔ㄦ秷浜°傚緢澶氫漢璇互涓虹ず渚?鏄紜殑銆?br>鐞嗙敱鏄痯鏄眬閮ㄧ殑鎸囬拡鍙橀噺錛屽畠娑堜骸鐨勬椂鍊欎細(xì)璁╁畠鎵鎸囩殑鍔ㄦ佸唴瀛樹竴璧峰畬铔嬨傝繖鏄敊瑙夛紒
void Func(void)
{
char *p = (char *) malloc(100); // 鍔ㄦ佸唴瀛樹細(xì)鑷姩閲婃斁鍚楋紵
}
鎴戜滑鍙戠幇鎸囬拡鏈変竴浜?浼兼槸鑰岄潪"鐨勭壒寰侊細(xì)
------------------------------------
錛?錛夋寚閽堟秷浜′簡錛屽茍涓嶈〃紺哄畠鎵鎸囩殑鍐呭瓨浼?xì)琚嚜鍔ㄩ噴鏀俱?br>錛?錛夊唴瀛樿閲婃斁浜嗭紝騫朵笉琛ㄧず鎸囬拡浼?xì)娑堜骸鎴栬呮垚浜哊ULL鎸囬拡銆?/font>
榪欒〃鏄庨噴鏀懼唴瀛樺茍涓嶆槸涓浠跺彲浠ヨ崏鐜囧寰呯殑浜嬨備篃璁告湁浜轟笉鏈嶆皵錛?br> 涓瀹氳鎵懼嚭鍙互鑽夌巼琛屼簨鐨勭悊鐢憋細(xì)
濡傛灉紼嬪簭緇堟浜嗚繍琛岋紝涓鍒囨寚閽堥兘浼?xì)娑堜骸锛屽姩鎬佸唴瀛樹細(xì)琚搷浣滅郴緇熷洖鏀躲?br> 鏃㈢劧濡傛錛屽湪紼嬪簭涓寸粓鍓嶏紝灝卞彲浠ヤ笉蹇呴噴鏀懼唴瀛樸佷笉蹇呭皢鎸囬拡璁劇疆涓篘ULL浜嗐?br> 緇堜簬鍙互鍋鋒噿鑰屼笉浼?xì)鍙戠敓閿欒浜嗗惂锛?br>鎯沖緱緹庛傚鏋滃埆浜烘妸閭f紼嬪簭鍙栧嚭鏉ョ敤鍒板叾瀹冨湴鏂規(guī)庝箞鍔烇紵
------------------------------------------
"閲庢寚閽?涓嶆槸NULL鎸囬拡錛屾槸鎸囧悜"鍨冨溇"鍐呭瓨鐨勬寚閽堛?br>浜轟滑涓鑸笉浼?xì)閿欑敤NULL鎸囬拡錛屽洜涓虹敤if璇彞寰堝鏄撳垽鏂?br>浣嗘槸"閲庢寚閽?鏄緢鍗遍櫓鐨勶紝if璇彞瀵瑰畠涓嶈搗浣滅敤銆?/p>
char *str = (char *) malloc(100);
{
public:
void Func(void){ cout << "Func of class A" << endl;
}
{
A *p;
{
A a;
p = &a; // 娉ㄦ剰 a 鐨勭敓鍛芥湡
}
p->Func();// p鏄?閲庢寚閽?
}
malloc涓巉ree鏄疌++/C璇█鐨勬爣鍑嗗簱鍑芥暟錛宯ew/delete鏄疌++鐨勮繍綆楃銆?br>瀹冧滑閮藉彲鐢ㄤ簬鐢寵鍔ㄦ佸唴瀛樺拰閲婃斁鍐呭瓨銆?/p>
鍥犳C++璇█闇瑕佷竴涓兘瀹屾垚鍔ㄦ佸唴瀛樺垎閰嶅拰鍒濆鍖栧伐浣滅殑榪愮畻絎ew錛屼互鍙?qiáng)涓涓兘瀹屾垚娓呯悊涓庨噴鏀懼唴瀛樺伐浣滅殑榪?/font>
class Obj
{
public :
Obj(void){ cout << "Initialization" << endl; }
~Obj(void){cout << "Destroy" << endl; }
void Initialize(void){ cout << "Initialization" << endl; }
void Destroy(void){ cout << "Destroy" << endl; }
};
void UseMallocFree(void)
{
Obj *a = (obj *)malloc(sizeof(obj)); // 鐢寵鍔ㄦ佸唴瀛?br>a->Initialize(); // 鍒濆鍖?br>a->Destroy(); // 娓呴櫎宸ヤ綔
free(a);// 閲婃斁鍐呭瓨
}
void UseNewDelete(void)
{
Obj *a = new Obj;// 鐢寵鍔ㄦ佸唴瀛樺茍涓斿垵濮嬪寲
delete a;// 娓呴櫎騫朵笖閲婃斁鍐呭瓨
}
鏃㈢劧new/delete鐨勫姛鑳藉畬鍏ㄨ鐩栦簡malloc/free錛屼負(fù)浠涔圕++涓嶆妸malloc/free娣樻卑鍑哄眬鍛紵
榪欐槸鍥犱負(fù)C++紼嬪簭緇忓父瑕佽皟鐢–鍑芥暟錛岃孋紼嬪簭鍙兘鐢╩alloc/free綆$悊鍔ㄦ佸唴瀛樸?/p>
------------------------------------------
濡傛灉鍦ㄧ敵璇峰姩鎬佸唴瀛樻椂鎵句笉鍒拌凍澶熷ぇ鐨勫唴瀛樺潡malloc鍜宯ew灝嗚繑鍥濶ULL鎸囬拡錛屽鍛婂唴瀛樼敵璇峰け璐ャ?br>閫氬父鏈変笁縐嶆柟寮忓鐞?鍐呭瓨鑰楀敖"闂銆?/p>
void Func(void)
{
A *a = new A;
if(a == NULL)
{
return;
}
...
}
void Func(void)
{
A *a = new A;
if(a == NULL)
{
cout << "Memory Exhausted" << endl;
exit(1);
}
...
}
涔熷彲浠ヨmalloc浜敤涓巒ew鐩稿悓鐨勫紓甯稿鐞嗗嚱鏁般傝緇嗗唴瀹硅鍙傝僀++浣跨敤鎵嬪唽銆?/p>
閭d箞鏂瑰紡錛?錛夊氨鏄懼緱鍔涗笉浠庡績錛堥噴鏀懼唴瀛樺緢楹葷儲錛夛紝搴旇鐢ㄦ柟寮忥紙2錛夋潵澶勭悊銆?/p>
涓嶈銆?font style="BACKGROUND-COLOR: #ff0000">濡傛灉鍙戠敓"鍐呭瓨鑰楀敖"榪欐牱鐨勪簨鎯咃紝涓鑸鏉ュ簲鐢ㄧ▼搴忓凡緇忔棤鑽彲鏁戙?br>濡傛灉涓嶇敤exit(1) 鎶婂潖紼嬪簭鏉姝伙紝瀹冨彲鑳戒細(xì)瀹蟲鎿嶄綔緋葷粺銆?br>
鏈変竴涓緢閲嶈鐨勭幇璞¤鍛婅瘔澶у銆傚浜?2浣嶄互涓婄殑搴旂敤紼嬪簭鑰岃█
錛屾棤璁烘庢牱浣跨敤malloc涓巒ew錛屽嚑涔庝笉鍙兘瀵艱嚧"鍐呭瓨鑰楀敖"銆?br>鎴戝湪Windows 98涓嬬敤Visual C++緙栧啓浜嗘祴璇曠▼搴忥紝瑙佺ず渚?銆?br>榪欎釜紼嬪簭浼?xì)鏃犱紤姝㈠湴杩愯涓嬪幓锛屾犚?guī)湰涓嶄細(xì)緇堟銆?br>鍥犱負(fù)32浣嶆搷浣滅郴緇熸敮鎸?铏氬瓨"錛屽唴瀛樼敤瀹屼簡錛岃嚜鍔ㄧ敤紜洏絀洪棿欏舵浛銆?br>鎴戝彧鍚埌紜洏鍢庡惐鍢庡惐鍦板搷錛學(xué)indow 98宸茬粡绱緱瀵歸敭鐩樸侀紶鏍囨鏃犲弽搴斻?/p>
鎴戝彲浠ュ緱鍑鴻繖涔堜竴涓粨璁猴細(xì)瀵逛簬32浣嶄互涓婄殑搴旂敤紼嬪簭錛?鍐呭瓨鑰楀敖"閿欒澶勭悊紼嬪簭姣棤鐢ㄥ銆傝繖涓嬪彲鎶奤nix鍜學(xué)indows紼嬪簭鍛樹滑涔愬潖浜嗭細(xì)鍙嶆閿欒澶勭悊紼嬪簭涓嶈搗浣滅敤錛屾垜灝變笉鍐欎簡錛岀渷浜嗗緢澶氶夯鐑︺?/p>
鎴戜笉鎯寵瀵艱鑰咃紝蹇呴』寮鴻皟錛氫笉鍔犻敊璇鐞嗗皢瀵艱嚧紼嬪簭鐨勮川閲忓緢宸紝鍗冧竾涓嶅彲鍥犲皬澶卞ぇ銆?/p>
紺轟緥9璇曞浘鑰楀敖鎿嶄綔緋葷粺鐨勫唴瀛?br>void main(void)
{
float *p = NULL;
while(TRUE)
{
p = new float[1000000];
cout << "eat memory" << endl;
if(p==NULL) exit(1);
}
}
10 malloc/free 鐨勪嬌鐢ㄨ鐐?br>------------------------------------------
鍑芥暟malloc鐨勫師鍨嬪涓嬶細(xì)
void * malloc(size_t size);
鐢╩alloc鐢寵涓鍧楅暱搴︿負(fù)length鐨勬暣鏁扮被鍨嬬殑鍐呭瓨錛岀▼搴忓涓嬶細(xì)
int *p = (int *) malloc(sizeof(int) * length);
鎴戜滑搴斿綋鎶婃敞鎰忓姏闆嗕腑鍦ㄤ袱涓绱犱笂錛?綾誨瀷杞崲"鍜?sizeof"銆?br>malloc榪斿洖鍊肩殑綾誨瀷鏄痸oid *錛屾墍浠ュ湪璋冪敤malloc鏃惰鏄懼紡鍦拌繘琛岀被鍨嬭漿鎹紝
灝唙oid * 杞崲鎴愭墍闇瑕佺殑鎸囬拡綾誨瀷銆?br>malloc鍑芥暟鏈韓騫朵笉璇嗗埆瑕佺敵璇風(fēng)殑鍐呭瓨鏄粈涔堢被鍨嬶紝瀹冨彧鍏沖績鍐呭瓨鐨勬誨瓧鑺傛暟銆?br>鎴戜滑閫氬父璁頒笉浣廼nt,float絳夋暟鎹被鍨嬬殑鍙橀噺鐨勭‘鍒囧瓧鑺傛暟銆備緥濡俰nt鍙橀噺鍦?6浣嶇郴緇熶笅鏄?涓瓧鑺?br>錛屽湪32浣嶄笅鏄?涓瓧鑺傦紱鑰宖loat鍙橀噺鍦?6浣嶇郴緇熶笅鏄?涓瓧鑺傦紝鍦?2浣嶄笅涔熸槸4涓瓧鑺傘?/p>
鏈濂界敤浠ヤ笅紼嬪簭浣滀竴嬈℃祴璇曪細(xì)
cout << sizeof(char) << endl;
cout << sizeof(int) << endl;
cout << sizeof(unsigned int) << endl;
cout << sizeof(long) << endl;
cout << sizeof(unsigned long) << endl;
cout << sizeof(float) << endl;
cout << sizeof(double) << endl;
cout << sizeof(void *) << endl;
鍦╩alloc鐨?()"涓嬌鐢╯izeof榪愮畻絎︽槸鑹ソ鐨勯鏍鹼紝浣嗚褰撳績鏈夋椂鎴戜滑浼?xì)鏄忎簡澶村Q屽啓鍑?p = malloc(sizeof(p))榪欐牱鐨勭▼搴忔潵銆?/p>
鍑芥暟free鐨勫師鍨嬪涓嬶細(xì)
void free( void * memblock );
涓轟粈涔坒ree鍑芥暟涓嶈薄malloc鍑芥暟閭f牱澶嶆潅鍛紵榪欐槸鍥犱負(fù)鎸囬拡p鐨勭被鍨嬩互鍙?qiáng)瀹冩墍鎸囩殑鍐呭瓨鐨勫閲忎簨鍏堥兘鏄煡閬撶殑錛岃鍙ree(p)鑳芥紜湴閲婃斁鍐呭瓨銆傚鏋減鏄疦ULL鎸囬拡錛岄偅涔坒ree瀵筽鏃犺鎿嶄綔澶氬皯嬈¢兘涓嶄細(xì)鍑洪棶棰樸?br>濡傛灉p涓嶆槸NULL鎸囬拡錛岄偅涔坒ree瀵筽榪炵畫鎿嶄綔涓ゆ灝變細(xì)瀵艱嚧紼嬪簭榪愯閿欒銆?/p>
11 new/delete 鐨勪嬌鐢ㄨ鐐?br>------------------------------------------
榪愮畻絎ew浣跨敤璧鋒潵瑕佹瘮鍑芥暟malloc綆鍗曞緱澶氾紝渚嬪錛?br>int *p1 = (int *)malloc(sizeof(int) * length);
int *p2 = new int[length];
榪欐槸鍥犱負(fù)new鍐呯疆浜唖izeof銆佺被鍨嬭漿鎹㈠拰綾誨瀷瀹夊叏媯鏌ュ姛鑳姐傚浜庨潪鍐呴儴鏁版嵁綾誨瀷鐨勫璞¤岃█錛?br>new鍦ㄥ垱寤哄姩鎬佸璞$殑鍚屾椂瀹屾垚浜嗗垵濮嬪寲宸ヤ綔銆?br>濡傛灉瀵硅薄鏈夊涓瀯閫犲嚱鏁幫紝閭d箞new鐨勮鍙ヤ篃鍙互鏈夊縐嶅艦寮忋?br>渚嬪
class Obj
{
public :
Obj(void); // 鏃犲弬鏁扮殑鏋勯犲嚱鏁?br>Obj(int x); // 甯︿竴涓弬鏁扮殑鏋勯犲嚱鏁?br>...
}
void Test(void)
{
Obj *a = new Obj;
Obj *b = new Obj(1); // 鍒濆間負(fù)1
...
delete a;
delete b;
}
濡傛灉鐢╪ew鍒涘緩瀵硅薄鏁扮粍錛岄偅涔堝彧鑳戒嬌鐢ㄥ璞$殑鏃犲弬鏁版瀯閫犲嚱鏁般備緥濡?br>Obj *objects = new Obj[100]; // 鍒涘緩100涓姩鎬佸璞?br>涓嶈兘鍐欐垚
Obj *objects = new Obj[100](1);// 鍒涘緩100涓姩鎬佸璞$殑鍚屾椂璧嬪垵鍊?
鍦ㄧ敤delete閲婃斁瀵硅薄鏁扮粍鏃訛紝鐣欐剰涓嶈涓簡絎﹀彿‘[]'銆備緥濡?br>delete []objects; // 姝g‘鐨勭敤娉?br>delete objects; // 閿欒鐨勭敤娉?br>鍚庤呯浉褰撲簬delete objects[0]錛屾紡鎺変簡鍙﹀99涓璞°?/p>
char * change(int n, int base)
{
char *p, *val;
if(base<2||base>36)
return NULL;
val = (char *) malloc(40);
if(!val)
return NULL;
p=val;
while( n)
{
*p= (n%base)>9? n%base-10+'a':n%base+'0';
n/=base;
++p;
}
reverse(val,p);
*p='\0';
++p;
return val;
}
int main(int argc, char* argv[])
{
char * test;
int n,base;
while(cin>>n>>base)
{
test=change(n,base);
if(test){
cout<<"Change "<<n<<" to base "<<base<<" = "<<test<<endl;
free(test);
}
else
cout<<"Wrong input."<<endl;
}
return 0;
}
姝婚攣錛?/p>
鏋勬垚姝婚攣鐨勬潯浠跺洓涓紝緙轟竴涓嶅彲
1涓涓嚎紼嬪彧鑳藉崟鐙敤涓涓祫婧?/p>
2姝e湪浣跨敤鐨勮祫婧愬彲浠ョ敵璇峰叾浠栬祫婧愶紝鍚屾椂鑷繁鐨勪笉浼?xì)鏀惧紑
3鍙湁鐢寵鍒板叾浠栬祫婧愶紝榪欎釜綰跨▼鎵嶄細(xì)鏀懼紑
4鍚勪釜綰跨▼鏄驚鐜姸鎬侊紝灝辨槸姣忎釜綰跨▼瑕佹寜鐓т竴瀹氱殑欏哄簭鐢寵錛岀劧鍚庢渶鍚庢垚涓轟竴涓幆銆?/p>
鍘熷瓙鎿嶄綔錛氬氨鏄笉鍙互鏈変腑鏂殑鎿嶄綔
淇″彿閲?涓巔v鏈夊叧錛岃〃紺鴻祫婧愮殑鍒嗛厤鍜岄噴鏀劇殑鎯呭喌銆備俊鍙稴錛宲鍒檚錛?錛寁鍒檚錛?銆俿琛ㄧず鍙互浣跨敤鐨勮繘紼嬬殑鏁扮洰銆傚鏋渟>0琛ㄧず榪樻湁榪涚▼鍙互浣跨敤錛岃皟鐢╬鍒欏垎閰嶄簡璧勬簮錛岄偅涔坰錛?錛宻<0琛ㄧず娌℃湁浜嗚祫婧愬彲浠ヤ嬌鐢紝鎴栬呴渶瑕侀噴鏀劇殑璧勬簮銆?璋冪敤v鎿嶄綔錛岃〃紺洪噴鏀劇殑璧勬簮錛屽洜姝錛?銆傝皟鐢≒鎿嶄綔嫻嬭瘯娑堟伅鏄惁鍒拌揪錛岃皟鐢╒鎿嶄綔鍙戦佹秷鎭?/p>
閮芥槸璁捐鍒板悓姝ュ拰浜掓枼姒傚康鐨勪笢瑗褲?/p>
涓寸晫鍖猴細(xì)灝辨槸鍦╬錛坰錛夊拰v錛坰錛変箣闂寸殑涓縐嶇姸鎬併?/p>
綰跨▼鍚屾錛?/p>
銆浣塊毝灞炰簬鍚屼竴榪涚▼鐨勫悇綰跨▼鍗忚皟涓鑷村湴宸ヤ綔縐頒負(fù)綰跨▼鐨勫悓姝?/p>
A銆佷嬌鐢?CCriticalSection 綾?
銆銆褰撳涓嚎紼嬭闂竴涓嫭鍗犳у叡浜祫婧愭椂,鍙互浣跨敤“涓寸晫鍖?#8221;瀵硅薄銆備換涓鏃跺埢鍙湁涓涓嚎紼嬪彲浠ユ嫢鏈変復(fù)鐣屽尯瀵硅薄錛屾嫢鏈変復(fù)鐣屽尯鐨勭嚎紼嬪彲浠ヨ闂淇濇姢璧鋒潵鐨勮祫婧愭垨浠g爜孌碉紝鍏朵粬甯屾湜榪涘叆涓寸晫鍖虹殑綰跨▼灝嗚鎸傝搗絳夊緟錛岀洿鍒版嫢鏈変復(fù)鐣屽尯鐨勭嚎紼嬫斁寮冧復(fù)鐣屽尯鏃朵負(fù)姝紝榪欐牱灝變繚璇佷簡涓嶄細(xì)鍦ㄥ悓涓鏃跺埢鍑虹幇澶氫釜綰跨▼璁塊棶鍏變韓璧勬簮銆?br>
CCriticalSection綾葷殑鐢ㄦ硶闈炲父綆鍗曪紝姝ラ濡備笅錛?br>銆
critical_section.Lock();鍦ㄧ嚎紼嬩腑璋冪敤璇ュ嚱鏁版潵浣跨嚎紼嬭幏寰楀畠鎵璇鋒眰鐨勪復(fù)鐣屽尯銆傚鏋滄鏃舵病鏈夊叾瀹冪嚎紼嬪崰鏈変復(fù)鐣屽尯瀵硅薄錛屽垯璋冪敤Lock()鐨勭嚎紼嬭幏寰椾復(fù)鐣屽尯錛涘惁鍒欙紝綰跨▼灝嗚鎸傝搗錛屽茍鏀懼叆鍒頒竴涓郴緇熼槦鍒椾腑絳夊緟錛岀洿鍒板綋鍓嶆嫢鏈変復(fù)鐣屽尯鐨勭嚎紼嬮噴鏀句簡涓寸晫鍖烘椂涓烘銆?
critical_section.Unlock();鍐嶉氫織涓鐐硅錛屽氨鏄嚎紼婣鎵ц鍒癱ritical_section.Lock();璇彞鏃訛紝濡傛灉鍏跺畠綰跨▼(B)姝e湪鎵цcritical_section.Lock();璇彞鍚庝笖critical_section. Unlock();璇彞鍓嶇殑璇彞鏃訛紝綰跨▼A灝變細(xì)絳夊緟錛岀洿鍒扮嚎紼婤鎵ц瀹宑ritical_section. Unlock();璇彞錛岀嚎紼婣鎵嶄細(xì)緇х畫鎵ц銆?
涓嬮潰鍐嶉氳繃涓涓疄渚嬭繘琛屾紨紺鴻鏄庛?/p>
渚嬬▼8 MultiThread8
UINT WriteW(LPVOID pParam);
UINT WriteD(LPVOID pParam);
#include "afxmt.h"瀹氫箟涓寸晫鍖哄拰涓涓瓧絎︽暟緇勶紝涓轟簡鑳藉鍦ㄤ笉鍚岀嚎紼嬮棿浣跨敤錛屽畾涔変負(fù)鍏ㄥ眬鍙橀噺錛?
CCriticalSection critical_section;
char g_Array[10];
娣誨姞綰跨▼鍑芥暟錛?
UINT WriteW(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
critical_section.Lock();
//閿佸畾涓寸晫鍖猴紝鍏跺畠綰跨▼閬囧埌critical_section.Lock();璇彞鏃惰絳夊緟
//鐩磋嚦鎵цcritical_section.Unlock();璇彞
for(int i=0;i<10;i++)
{
g_Array[i]=''W'';
pEdit->SetWindowText(g_Array);
Sleep(1000);
}
critical_section.Unlock();
return 0;
}
UINT WriteD(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
critical_section.Lock();
//閿佸畾涓寸晫鍖猴紝鍏跺畠綰跨▼閬囧埌critical_section.Lock();璇彞鏃惰絳夊緟
//鐩磋嚦鎵цcritical_section.Unlock();璇彞
for(int i=0;i<10;i++)
{
g_Array[i]=''D'';
pEdit->SetWindowText(g_Array);
Sleep(1000);
}
critical_section.Unlock();
return 0;
}
void CMultiThread8Dlg::OnWritew()
{
CWinThread *pWriteW=AfxBeginThread(WriteW,
&m_ctrlW,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteW->ResumeThread();
}
void CMultiThread8Dlg::OnWrited()
{
CWinThread *pWriteD=AfxBeginThread(WriteD,
&m_ctrlD,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteD->ResumeThread();
}
鐢變簬浠g爜杈冪畝鍗曪紝涓嶅啀璇﹁堪銆傜紪璇戙佽繍琛岃渚嬬▼錛屾?zhèn)ㄥ彲浠q炵畫鐐瑰嚮涓や釜鎸夐挳錛岃瀵熶綋浼?xì)鋸?fù)鐣岀被鐨勪綔鐢ㄣ?B銆佷嬌鐢?CEvent 綾?
銆銆CEvent 綾繪彁渚涗簡瀵逛簨浠剁殑鏀寔銆備簨浠舵槸涓涓厑璁鎬竴涓嚎紼嬪湪鏌愮鎯呭喌鍙戠敓鏃訛紝鍞ら啋鍙﹀涓涓嚎紼嬬殑鍚屾瀵硅薄銆備緥濡傚湪鏌愪簺緗戠粶搴旂敤紼嬪簭涓紝涓涓嚎紼嬶紙璁頒負(fù)A錛夎礋璐g洃鍚氳绔彛錛屽彟澶栦竴涓嚎紼嬶紙璁頒負(fù)B錛夎礋璐f洿鏂扮敤鎴鋒暟鎹傞氳繃浣跨敤CEvent 綾伙紝綰跨▼A鍙互閫氱煡綰跨▼B浣曟椂鏇存柊鐢ㄦ埛鏁版嵁銆傛瘡涓涓狢Event 瀵硅薄鍙互鏈変袱縐嶇姸鎬侊細(xì)鏈変俊鍙風(fēng)姸鎬佸拰鏃犱俊鍙風(fēng)姸鎬併傜嚎紼嬬洃瑙嗕綅浜庡叾涓殑CEvent 綾誨璞$殑鐘舵侊紝騫跺湪鐩稿簲鐨勬椂鍊欓噰鍙栫浉搴旂殑鎿嶄綔銆?br>銆銆鍦∕FC涓紝CEvent 綾誨璞℃湁涓ょ綾誨瀷錛氫漢宸ヤ簨浠跺拰鑷姩浜嬩歡銆備竴涓嚜鍔–Event 瀵硅薄鍦ㄨ鑷沖皯涓涓嚎紼嬮噴鏀懼悗浼?xì)鑷姩杩斿洖鍒版棤淇″忥L(fēng)姸鎬侊紱鑰屼漢宸ヤ簨浠跺璞¤幏寰椾俊鍙峰悗錛岄噴鏀懼彲鍒╃敤綰跨▼錛屼絾鐩村埌璋冪敤鎴愬憳鍑芥暟ReSetEvent()鎵嶅皢鍏惰緗負(fù)鏃犱俊鍙風(fēng)姸鎬併傚湪鍒涘緩CEvent 綾葷殑瀵硅薄鏃訛紝榛樿鍒涘緩鐨勬槸鑷姩浜嬩歡銆?CEvent 綾葷殑鍚勬垚鍛樺嚱鏁扮殑鍘熷瀷鍜屽弬鏁拌鏄庡涓嬶細(xì)
1銆丆Event(BOOL bInitiallyOwn=FALSE, BOOL bManualReset=FALSE, LPCTSTR lpszName=NULL, LPSECURITY_ATTRIBUTES lpsaAttribute=NULL);
2銆丅OOL CEvent錛氾細(xì)SetEvent();
銆銆灝?CEvent 綾誨璞$殑鐘舵佽緗負(fù)鏈変俊鍙風(fēng)姸鎬併傚鏋滀簨浠舵槸浜哄伐浜嬩歡錛屽垯 CEvent 綾誨璞′繚鎸佷負(fù)鏈変俊鍙風(fēng)姸鎬侊紝鐩村埌璋冪敤鎴愬憳鍑芥暟ResetEvent()灝?鍏墮噸鏂拌涓烘棤淇″彿鐘舵佹椂涓烘銆傚鏋淐Event 綾誨璞′負(fù)鑷姩浜嬩歡錛屽垯鍦⊿etEvent()灝嗕簨浠惰緗負(fù)鏈変俊鍙風(fēng)姸鎬佸悗錛孋Event 綾誨璞$敱緋葷粺鑷姩閲嶇疆涓烘棤淇″彿鐘舵併?br>
濡傛灉璇ュ嚱鏁版墽琛屾垚鍔燂紝鍒欒繑鍥為潪闆跺鹼紝鍚﹀垯榪斿洖闆躲?/p>
3銆丅OOL CEvent錛氾細(xì)ResetEvent();
銆銆璇ュ嚱鏁板皢浜嬩歡鐨勭姸鎬佽緗負(fù)鏃犱俊鍙風(fēng)姸鎬侊紝騫朵繚鎸佽鐘舵佺洿鑷砈etEvent()琚皟鐢ㄦ椂涓烘銆傜敱浜庤嚜鍔ㄤ簨浠舵槸鐢辯郴緇熻嚜鍔ㄩ噸緗紝鏁呰嚜鍔ㄤ簨浠朵笉闇瑕佽皟鐢ㄨ鍑芥暟銆傚鏋滆鍑芥暟鎵ц鎴愬姛錛岃繑鍥為潪闆跺鹼紝鍚﹀垯榪斿洖闆躲傛垜浠竴鑸氳繃璋冪敤WaitForSingleObject鍑芥暟鏉ョ洃瑙嗕簨浠剁姸鎬併傚墠闈㈡垜浠凡緇忎粙緇嶄簡璇ュ嚱鏁般傜敱浜庤璦鎻忚堪鐨勫師鍥狅紝CEvent 綾葷殑鐞嗚В紜疄鏈変簺闅懼害錛屼絾鎮(zhèn)ㄥ彧瑕侀氳繃浠旂粏鐜╁懗涓嬮潰渚嬬▼錛屽鐪嬪嚑閬嶅氨鍙悊瑙c?/p>
渚嬬▼9 MultiThread9
UINT WriteW(LPVOID pParam);
UINT WriteD(LPVOID pParam);
涓轟簡鏂囦歡涓兘澶熸紜嬌鐢ㄥ悓姝ョ被錛屽湪鏂囦歡寮澶存坊鍔?/p>
#include "afxmt.h"瀹氫箟浜嬩歡瀵硅薄鍜屼竴涓瓧絎︽暟緇勶紝涓轟簡鑳藉鍦ㄤ笉鍚岀嚎紼嬮棿浣跨敤錛屽畾涔変負(fù)鍏ㄥ眬鍙橀噺銆?
CEvent eventWriteD;
char g_Array[10];
娣誨姞綰跨▼鍑芥暟錛?
UINT WriteW(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
for(int i=0;i<10;i++)
{
g_Array[i]=''W'';
pEdit->SetWindowText(g_Array);
Sleep(1000);
}
eventWriteD.SetEvent();
return 0;
}
UINT WriteD(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
WaitForSingleObject(eventWriteD.m_hObject,INFINITE);
for(int i=0;i<10;i++)
{
g_Array[i]=''D'';
pEdit->SetWindowText(g_Array);
Sleep(1000);
}
return 0;
}
銆銆浠旂粏鍒嗘瀽榪欎袱涓嚎紼嬪嚱鏁? 鎮(zhèn)ㄥ氨浼?xì)姝<嫯鐞嗚ВCEvent 綾匯傜嚎紼媁riteD鎵ц鍒?WaitForSingleObject(eventWriteD.m_hObject,INFINITE);澶勭瓑寰咃紝鐩村埌浜嬩歡eventWriteD涓烘湁淇″彿璇ョ嚎紼嬫墠寰涓嬫墽琛岋紝鍥犱負(fù)eventWriteD瀵硅薄鏄嚜鍔ㄤ簨浠訛紝鍒欏綋WaitForSingleObject()榪斿洖鏃訛紝緋葷粺鑷姩鎶奺ventWriteD瀵硅薄閲嶇疆涓烘棤淇″彿鐘舵併?
void CMultiThread9Dlg::OnWritew()
{
CWinThread *pWriteW=AfxBeginThread(WriteW,
&m_ctrlW,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteW->ResumeThread();
CWinThread *pWriteD=AfxBeginThread(WriteD,
&m_ctrlD,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteD->ResumeThread();
}
緙栬瘧騫惰繍琛岀▼搴忥紝鍗曞嚮“鍐?#8216;W’”鎸夐挳錛屼綋浼?xì)浜嬩欢瀵硅薄鐨勪綔鐢ㄣ?C銆佷嬌鐢–Mutex 綾?/p>
銆銆浜掓枼瀵硅薄涓庝復(fù)鐣屽尯瀵硅薄寰堝儚.浜掓枼瀵硅薄涓庝復(fù)鐣屽尯瀵硅薄鐨勪笉鍚屽湪浜?浜掓枼瀵硅薄鍙互鍦ㄨ繘紼嬮棿浣跨敤,鑰屼復(fù)鐣屽尯瀵硅薄鍙兘鍦ㄥ悓涓榪涚▼鐨勫悇綰跨▼闂翠嬌鐢ㄣ傚綋鐒訛紝浜掓枼瀵硅薄涔熷彲浠ョ敤浜庡悓涓榪涚▼鐨勫悇涓嚎紼嬮棿錛屼絾鏄湪榪欑鎯呭喌涓嬶紝浣跨敤涓寸晫鍖轟細(xì)鏇磋妭鐪佺郴緇熻祫婧愶紝鏇存湁鏁堢巼銆?/p>
D銆佷嬌鐢–Semaphore 綾?/p>
銆銆褰撻渶瑕佷竴涓鏁板櫒鏉ラ檺鍒跺彲浠ヤ嬌鐢ㄦ煇涓嚎紼嬬殑鏁扮洰鏃訛紝鍙互浣跨敤“淇″彿閲?#8221;瀵硅薄銆侰Semaphore 綾葷殑瀵硅薄淇濆瓨浜嗗褰撳墠璁塊棶鏌愪竴鎸囧畾璧勬簮鐨勭嚎紼嬬殑璁℃暟鍊鹼紝璇ヨ鏁板兼槸褰撳墠榪樺彲浠ヤ嬌鐢ㄨ璧勬簮鐨勭嚎紼嬬殑鏁扮洰銆傚鏋滆繖涓鏁拌揪鍒頒簡闆訛紝鍒欐墍鏈夊榪欎釜CSemaphore 綾誨璞℃墍鎺у埗鐨勮祫婧愮殑璁塊棶灝濊瘯閮借鏀懼叆鍒頒竴涓槦鍒椾腑絳夊緟錛岀洿鍒拌秴鏃舵垨璁℃暟鍊間笉涓洪浂鏃朵負(fù)姝€備竴涓嚎紼嬭閲婃斁宸茶闂簡琚繚鎶ょ殑璧勬簮鏃訛紝璁℃暟鍊煎噺1錛涗竴涓嚎紼嬪畬鎴愪簡瀵硅鎺у叡浜祫婧愮殑璁塊棶鏃訛紝璁℃暟鍊煎1銆傝繖涓CSemaphore 綾誨璞℃墍鎺у埗鐨勮祫婧愬彲浠ュ悓鏃舵帴鍙楄闂殑鏈澶х嚎紼嬫暟鍦ㄨ瀵硅薄鐨勬瀯寤哄嚱鏁頒腑鎸囧畾銆?br>
CSemaphore 綾葷殑鏋勯犲嚱鏁板師鍨嬪強(qiáng)鍙傛暟璇存槑濡備笅錛?/p>
CSemaphore (LONG lInitialCount=1, LONG lMaxCount=1, LPCTSTR pstrName=NULL, LPSECURITY_ATTRIBUTES lpsaAttributes=NULL);
銆銆鍦ㄧ敤CSemaphore 綾葷殑鏋勯犲嚱鏁板垱寤轟俊鍙烽噺瀵硅薄鏃惰鍚屾椂鎸囧嚭鍏佽鐨勬渶澶ц祫婧愯鏁板拰褰撳墠鍙敤璧勬簮璁℃暟銆備竴鑸槸灝嗗綋鍓嶅彲鐢ㄨ祫婧愯鏁拌緗負(fù)鏈澶ц祫婧愯鏁幫紝姣忓鍔犱竴涓嚎紼嬪鍏變韓璧勬簮鐨勮闂紝褰撳墠鍙敤璧勬簮璁℃暟灝變細(xì)鍑?錛屽彧瑕佸綋鍓嶅彲鐢ㄨ祫婧愯鏁版槸澶т簬0鐨勶紝灝卞彲浠ュ彂鍑轟俊鍙烽噺淇″彿銆備絾鏄綋鍓嶅彲鐢ㄨ鏁板噺灝忓埌0鏃訛紝鍒欒鏄庡綋鍓嶅崰鐢ㄨ祫婧愮殑綰跨▼鏁板凡緇忚揪鍒頒簡鎵鍏佽鐨勬渶澶ф暟鐩紝涓嶈兘鍐嶅厑璁稿叾瀹冪嚎紼嬬殑榪涘叆錛屾鏃剁殑淇″彿閲忎俊鍙峰皢鏃犳硶鍙戝嚭銆傜嚎紼嬪湪澶勭悊瀹屽叡浜祫婧愬悗錛屽簲鍦ㄧ寮鐨勫悓鏃墮氳繃ReleaseSemaphore()鍑芥暟灝嗗綋鍓嶅彲鐢ㄨ祫婧愭暟鍔?銆?/p>
涓嬮潰緇欏嚭涓涓畝鍗曞疄渚嬫潵璇存槑 CSemaphore 綾葷殑鐢ㄦ硶銆?/p>
渚嬬▼10 MultiThread10
UINT WriteA(LPVOID pParam);
UINT WriteB(LPVOID pParam);
UINT WriteC(LPVOID pParam);
涓轟簡鏂囦歡涓兘澶熸紜嬌鐢ㄥ悓姝ョ被錛屽湪鏂囦歡寮澶存坊鍔狅細(xì)
#include "afxmt.h"瀹氫箟淇″彿閲忓璞″拰涓涓瓧絎︽暟緇勶紝涓轟簡鑳藉鍦ㄤ笉鍚岀嚎紼嬮棿浣跨敤錛屽畾涔変負(fù)鍏ㄥ眬鍙橀噺錛?
CSemaphore semaphoreWrite(2,2); //璧勬簮鏈澶氳闂嚎紼?涓紝褰撳墠鍙闂嚎紼嬫暟2涓?
char g_Array[10];
娣誨姞涓変釜綰跨▼鍑芥暟錛?/p>
UINT WriteA(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
CString str;
for(int i=0;i<10;i++)
{
pEdit->GetWindowText(str);
g_Array[i]=''A'';
str=str+g_Array[i];
pEdit->SetWindowText(str);
Sleep(1000);
}
ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
return 0;
}
UINT WriteB(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
CString str;
for(int i=0;i<10;i++)
{
pEdit->GetWindowText(str);
g_Array[i]=''B'';
str=str+g_Array[i];
pEdit->SetWindowText(str);
Sleep(1000);
}
ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
return 0;
}
UINT WriteC(LPVOID pParam)
{
CEdit *pEdit=(CEdit*)pParam;
pEdit->SetWindowText("");
WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
for(int i=0;i<10;i++)
{
g_Array[i]=''C'';
pEdit->SetWindowText(g_Array);
Sleep(1000);
}
ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
return 0;
}
榪欎笁涓嚎紼嬪嚱鏁頒笉鍐嶅璇淬傚湪淇″彿閲忓璞℃湁淇″彿鐨勭姸鎬佷笅錛岀嚎紼嬫墽琛屽埌WaitForSingleObject璇彞澶勭戶緇墽琛岋紝鍚屾椂鍙敤綰跨▼鏁板噺1錛涜嫢綰跨▼鎵ц鍒癢aitForSingleObject璇彞鏃朵俊鍙烽噺瀵硅薄鏃犱俊鍙鳳紝綰跨▼灝卞湪榪欓噷絳夊緟錛岀洿鍒頒俊鍙烽噺瀵硅薄鏈変俊鍙風(fēng)嚎紼嬫墠寰涓嬫墽琛屻?
void CMultiThread10Dlg::OnStart()
{
CWinThread *pWriteA=AfxBeginThread(WriteA,
&m_ctrlA,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteA->ResumeThread();
CWinThread *pWriteB=AfxBeginThread(WriteB,
&m_ctrlB,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteB->ResumeThread();
CWinThread *pWriteC=AfxBeginThread(WriteC,
&m_ctrlC,
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
pWriteC->ResumeThread();
}
OOP object oriented programming
property method
member variable,member function
encapsulation
enheritance
polymorphism
overloading
ellipse circle triangle rectangle square
virtual浣滅敤錛?br>濡傛灉娌℃湁virtual錛岄偅涔堝氨緇ф壙浜嗗熀綾繪寚閽堢殑鎬ц川錛屽鏋滄湁virtual錛岄偅涔堝氨鎸囧悜瀵?/p>
璞$殑綾誨瀷銆傝櫄鍑芥暟姝e紡涓轟簡瀵?#8220;濡傛灉浠ヤ竴涓熀綾葷殑鎸囬拡鎸囧悜涓涓淳鐢熺被鐨勫璞★紝閭d箞
閫氳繃璇ユ寚閽堝彧鑳藉璋冪敤鍩虹被鎵瀹氫箟鐨勬垚鍛樺嚱鏁?#8221;榪欐潯瑙勫垯鍙嶅叾閬撹岃鐨勮璁°?/p>
綰櫄鍑芥暟浣滅敤錛?br>灝辨槸鍦ㄥ熀綾諱腑騫朵笉瀹炵幇錛屼絾鏄負(fù)浜嗗湪媧劇敓綾諱腑浣跨敤錛屽氨闇瑕佸垎閰嶄竴涓茍涓嶆墽琛岋紝浣?/p>
鏄繕闇瑕佺戶鎵跨殑鍑芥暟銆傚氨鏄函铏氬嚱鏁?virtual function錛堬級錛?錛涚函铏氬嚱鏁頒笉闇瑕?/p>
瀹氫箟錛屽湪媧劇敓綾諱腑琚噸鏂板畾涔夈?/p>
浠涔堟槸鎶借薄綾伙紵
鎷ユ湁铏氬嚱鏁扮殑綾匯傛娊璞$被涓嶈兘浜х敓鍑哄璞″疄浣擄紝浣嗘槸鍙互鎷ユ湁鎸囧悜鎶借薄綾葷殑鎸囬拡錛?/p>
渚夸簬鎿嶄綔鎶借薄綾葷殑鍚勪釜媧劇敓綾匯?br>铏氬嚱鏁版淳鐢熶笅鍘諱粛鏄櫄鍑芥暟錛岃屼笖鍙互鐪佺暐virtual銆?/p>
铏氬嚱鏁板埌搴曟湁浠涔堜綔鐢紵
1濡傛灉浣犱及璁℃淳鐢熺被浼?xì)閲嶆柊瀹氫箟涓涓垚鍛樺嚱鏁幫紝閭d箞浣犲氨鎶婂熀綾諱腑鐨勮繖涓嚱鏁板啓鎴?/p>
virtual
2閫氳繃鍗曚竴鎸囦護(hù)璋冪敤涓嶅悓鍑芥暟錛屽氨鏄鎬丳olymorphism,"ability to asume many
forms"
3铏氬嚱鏁版槸c錛嬶紜璇█polymorphism鎬ц川浠ュ強(qiáng)鍔ㄦ佽仈緙栫殑鍏抽敭
4鏃㈢劧鎶借薄綾諱腑鐨勮櫄鍑芥暟涓嶆墦綆楄璋冪敤錛岄偅涔堝氨鎶婂畠璁劇疆鎴愮函铏氬嚱鏁般?br>5鎷ユ湁綰櫄鍑芥暟鑰呬負(fù)鎶借薄綾匯?br>6鎶借薄綾諱笉鑳戒駭鐢熷嚭瀵硅薄瀹炰綋錛屼絾鏄垜浠彲浠ユ嫢鏈夋寚鍚戞娊璞$被鐨勬寚閽堬紝浠ヤ究浜庢搷浣滄娊
璞$被鐨勫悇涓淳鐢熺被銆?br>7铏氬嚱鏁版淳鐢熶笅鍘諱粛鏄櫄鍑芥暟錛屽彲浠ヤ笉鍐檝irtual銆?/p>
铏氬嚱鏁版庢牱宸ヤ綔錛?br>鍦ㄥ惈鏈夎櫄鍑芥暟鐨勭被涓紝緙栬瘧鍣ㄤ細(xì)涓哄畠鍋氬嚭涓涓櫄鍑芥暟琛紝琛ㄤ腑鐨勬瘡涓涓厓绱犻兘鎸囧悜
涓涓櫄鍑芥暟鐨勫湴鍧銆?/p>
浠涔堟槸upcasting錛?br>瀹冩槸鍚戜笂寮哄埗鎬х被鍨嬭漿鎹€?br>class CMyDoc:public CDocument;
CMyDoc mydoc;
(CDocument)mydodc.func();(upcasting)
娉ㄦ剰涓鑸笉鐢╱pcasting銆?/p>
闈欐佸彉閲忓埌搴曟槸浠涔堬紵
static double m_rate;
static鎴愬憳鍙橀噺涓嶅睘浜庡璞$殑涓閮ㄥ垎錛岃屾槸綾葷殑涓閮ㄥ垎錛岀▼搴忓彲浠ュ湪娌℃湁璇炵敓浠諱綍
瀵硅薄鐨勬椂鍊欏氨澶勭悊姝ょ鎴愬憳鍙橀噺錛屼絾棣栫浉浣犲繀欏誨垵濮嬪寲瀹冦?br>static鎴愬憳鍙橀噺鐨勫垵濮嬪寲涓嶈瀹夋帓鍒版瀯閫犲嚱鏁頒腑錛屽洜涓烘瀯閫犲嚱鏁板彲浠ヤ竴鍐嶈璋冪敤錛?/p>
涔熶笉瑕佹妸鍒濆鍖栧畨鎺掑湪澶?a onclick="javascript:tagshow(event, '%CE%C4%BC%FE');" href="javascript:;" target=_self>鏂囦歡涓紝鍥犱負(fù)鍙兘浼?xì)琚祵鍏ュ埌璁稿鍦版枏V傚簲璇ュ湪綾諱互澶栫殑
浠諱綍浣嶇疆璁懼畾鍏跺垵鍊箋?br>static鍙橀噺鍙互鎯寵薄鎴愪竴涓叏紼嬪彉閲忋?br>static鎴愬憳鍑芥暟涓嶉渶瑕佸熷姪浠諱綍瀵硅薄錛屽彲浠ヨ璋冪敤鎵ц錛屾墍浠ョ紪璇戝櫒涓嶄細(xì)涓哄畠鏆楀姞
涓涓猼his鎸囬拡銆傚洜姝tatic鎴愬憳鍑芥暟鏃犳硶澶勭悊綾諱腑鐨刵on錛峴tatic鎴愬憳鍙橀噺銆?br>static鐨勬瀯閫犲緢鏋愬灝辯浉褰撲簬鍏ㄥ眬鍙橀噺錛屽彧鏄畠浼?xì)鍦ㄥ叏灞鍑芥暟涔嬪墠鏋愬銆傛瀯閫犲嚱鏁?/p>
鍜屾瀽澶熷嚱鏁伴兘鏄互鍑芥暟涓烘爣蹇楃殑銆?/p>
error LINK2001錛歶nresolved external symbol""();涓鑸槸鍥犱負(fù)娌℃湁鍒濆鍖杝tatic
鐨勫箋?/p>
new鐨勫ソ澶勶紵
鍒嗛厤瀵硅薄鎵闇鍐呭瓨絀洪棿錛屽茍涓斿紩鍙戞瀯閫犲嚱鏁扮殑鎵ц銆?/p>
浠涔堟槸RTTI?
RTTI Runtime Type Information 鍔ㄦ佺被鍨嬭瘑鍒?br>灝辨槸鐭ラ亾紼嬪簭鎵ц榪囩▼涓煇涓璞℃槸灞炰簬閭d釜綾葷殑銆?/p>
浠涔堟槸鍔ㄦ佺敓鎴愶紙Dynamic Creation錛?
浠涔堟槸寮傛牱澶勭悊(Exception Handling)?
浣跨敤涓変釜expection淇濈暀瀛?
try:鍏跺悗璺熼殢涓孌典互{}鍦堝嚭鐨勭▼搴忎唬鐮侊紝exception灝嗗湪閭i噷琚鐞嗐傦紙灝辨槸灝嗚澶?/p>
鐞嗙殑浠g爜錛?br>catch錛氬叾鍚巤},閲岃竟鏄鐞嗙▼搴忋傦紙灝辨槸鎬庢牱澶勭悊浜嗭級
throw錛氱敤鏉ヤ駭鐢熶竴涓猠xception銆?/p>
浠涔堟槸妯℃澘錛?br>template錛屽氨鏄彲浠ラ噸澶嶅埄鐢ㄧ殑鏋舵瀯銆?br>template <class T>
T power(T base,int exponent);
榪欓噷鐨凾灝辨槸鍙互闅忔椂鏀瑰彉鐨勯噺銆傚綋鐒惰繖閲岀殑T鏄被鐨勬剰鎬濓紝鍙互鏄郴緇熷畾涔夌殑綾伙紝
涔熷彲浠ユ槸鑷繁瀹氫箟鐨勭被銆?br>榪欓噷娉ㄦ剰瀵逛簬錛屾ā鏉匡紝涓や釜瀵硅薄濡傛灉閮戒嬌鐢ㄤ簡鍚屼竴涓ā鏉匡紝鍦ㄧ紪璇戠殑鏃跺欐槸涓嶇煡閬?/p>
鐨勶紝浣嗘槸閾炬帴鐨勬椂鍊欙紝榪炴帴鍣ㄥ氨浼?xì)灏嗕粬浠噸澶嶇殑閮ㄥ垎鍘绘帀銆傛爣鍑嗙殑璇村氨鏄?閾炬帴鍣ㄤ細(xì)
鎶婃墍鏈夊啑浣欑殑template鐮佸墧闄ゃ傚湪Borland閾炬帴鍣ㄩ噷澶寸О涓簊mart鎶鏈?/p>