前言:想要寫出一篇令人眼前一亮的文章嗎?我們特意為您整理了5篇管理者的職責范文,相信會為您的寫作帶來幫助,發現更多的寫作思路和靈感。
你要是管理者的話,我給你一個選擇。某項工作,你必須要得罪一個人的話,你愿意得罪上司、下屬、還是同僚?如果只能讓一個人不痛快的話,你選擇讓誰不痛快?很多管理者在工作中,非常喜歡和下屬混,號稱和群眾打得火熱,深入到群眾中去。甚至有某營銷總監和區域經理說:“兄弟們,我們只有把商抓在手上了,我們只有深入到終端了,我們的力量才強大,我們才有資格和老板談。我們在老板的眼里是不可替代的,他會有所顧忌,無論我們在不在這個公司干,我們都將掌握主動權。所以從現在開始,我們開始我們的掌控渠道戰略,我們要為自己好好干。”
其實管理者是不是要和下屬混在一起,不同文化的企業,有不同的觀點,不同的環境下,有不同的觀點。比如在人人是企業主人的國企,管理者就是要和下屬混在一起,否則群眾不滿意,管理者通不過民主評議,那是要下臺的。而外企的管理者,相對來說就有管理者的樣子,很多外企的管理者,有專門的食堂,專門的電梯,專門的辦公樓層等,用來體現管理者的威嚴。他們的哲學是,我是管理者,我是代表公司來做管理工作的,我和員工是工作關系,沒必要和員工混在一起,我不是來交朋友的,我要是需要朋友的話,我會買一條狗。
再比如一個銷售類公司,在遙遠新疆的喀什有個辦事處,辦事處里一個主任,和三個銷售代表。你說這個辦事處的管理是什么狀態,他們是天高皇帝遠呀。這四個人,一定不會“正規”,正規地著裝、正規地開會、正規地談話,這個主任一定采取,大家庭一樣的管理辦法。主任是張哥,下面帶幾個小弟,主任天然地和下屬最“親”,而不是遠在上海的總部。總部的郭總,對他們來說,只能是傳說中的人物。每天就熟頭熟臉的四個人,特別知根知底,互相了解得不能在了解了,非正規才是高效的管理方法。就像“許三多”當年在的高原營地,連班長就5個人,吃飯和睡覺都在一起,想正規都難,連訓練都省了。德魯克說:“管理不在于知,而在于行”,不在于方式,而在于效果,結果導向。
關鍵詞:利益相關者 集體選擇 價值鏈 價值增值 合作共贏
一、引言
利益相關者集體選擇企業理論將利益相關者分為內部利益相關者和外部利益相關者,企業是內部利益相關者通過集體選擇簽訂組織契約形成的,組織契約規定包括企業的價值增值如何在內部利益相關者之間分享在內的企業基本事項,起著公司章程的作用,組織契約的簽訂界定了企業的所有權邊界,企業為內部利益相關者所擁有;而外部利益相關者只與企業簽訂交易契約,交易契約的簽訂界定了企業的經營邊界,企業的價值增值是交易契約不斷簽訂和履行的結果,企業的經營邊界也隨之變動。該理論認為企業的目標是利益相關者價值最大化,這里的利益相關者價值等同于內部利益相關者價值也等同于企業價值,企業價值最大化要求企業價值增值最大化,利益相關者集體選擇理論的核心和生命力就在于能否實現供應鏈上下游企業間的合作,使得各企業能夠分享更多的價值增值,以實現企業價值最大化。這里企業價值增值取決于價值鏈總體增值及價值鏈總體增值對該企業的分配,至于企業價值增值如何在內部利益相關者之間分享已在組織契約中規定,即使內部利益相關者之間存在利益沖突也不改變企業價值最大化的共同訴求,所以不在本文的討論范圍內,本文只研究企業價值增值最大化,即企業價值創造。
二、實現合作共贏,實現價值鏈總體增值
價值鏈總體增值是指價值鏈最終產出與價值鏈流程總投入的差額,也即價值鏈上各企業創造的價值增值之和,也就是企業與外部利益相關者創造的價值增值之和。內部利益相關者不同企業的所有權結構不同,不同企業內外部利益相關者構成不同,當內部利益相關者只有股東企業只為股東所擁有時,外部利益相關者范圍最大化,包括債權人、供應商、員工、政府、客戶等。目前價值管理主要針對企業內部價值驅動因素進行分析研究,并未對企業與外部利益相關者的交易行為進行全面研究以及探討交易模式對企業價值增值的影響。企業如何進行外部利益相關者管理以實現價值鏈總體增值成為研究的重點。
(一)銀企戰略聯盟
銀行是企業最主要的債權人,銀企關系融洽對企業有百利而無一害,必要時企業可以利用其良好的信用等級、融洽的銀企關系與銀行形成戰略聯盟實現合作雙贏。
銀企戰略聯盟一方面可以共享客戶資源,另一方面可以制約并削弱競爭對手。
美洲航空公司(American Airlines)和花旗銀行(Citibank)建立了長期的銀企戰略聯盟關系。在聯盟的合作協議中約定:信用卡用戶可以獲得航空公司的旅客航程累計積分――持卡消費1美元相當于累積1英里。 這樣一來,美洲航空提高了乘客的忠誠度,而花旗銀行則獲得了一個高信譽度的新客戶群,便于進行交叉營銷(cross -marketing)。后來,一家名為 MCI 的大型長途電話公司也加入到該合作伙伴關系中,為每1美元的長途電話費提供多重航程累計積分。
1990年,當美國電話電報公司(AT&T)開始發行“環球卡”(Universal Card),大舉進入信用卡市場時,Visa卡和萬事達卡(Mastercard)的第一大發卡行――花旗銀行就啟動了一項合作計劃,即鼓勵它的1 460萬 Visa卡用戶選擇MCI公司提供的長話服務,作為對AT&T公司進入信用卡市場的反擊。
另外,銀企聯盟在中小企業融資擔保中發揮重要作用。供應鏈的核心企業與銀行結成銀企戰略聯盟,并參與到原有的供應鏈中,組成新的銀企聯盟供應鏈。核心企業在銀行為其下達的配額內作為供應鏈中的中小企業的擔保方,由銀行直接向中小企業發放貸款,從而可以順利解決中小企業的融資、擔保問題,進而提高供應鏈企業的競爭力,并有效地控制銀行的信貸風險,實現銀企共贏。
青島軟控(002073)面向中小企業生產的大型專用設備質優卻滯銷,中小企業急需設備卻資金不足又融資困難,這時供應鏈金融解決了兩頭難問題。假設設備款300萬元,青島軟控將設備銷售給中小企業A并收取20%價款60萬元同時發貨,A企業取得設備所有權并向銀行抵押借款300萬元,青島軟控向銀行承諾若A企業到期未還款其將購回設備,銀行基于軟控良好信用向A企業放款,A企業取得借款用于支付青島軟控貨款。這一融資模式對供應鏈三方均有利,青島軟控增加了設備銷量同時及時收回應收款,中小企業取得貸款滿足投資所需,銀行降低信貸風險確保資金到期收回。
(二)供應商管理庫存(VMI)
供應商管理庫存(VMI)是一種在供應鏈環境下的庫存運作模式,本質上是將多級供應鏈問題變成單級庫存管理問題,以供應商為中心,以雙方最低成本為目標,在一個共同的框架協議下把下游企業的庫存決策權給上游供應商,供應商收集分銷中心、倉庫和POS數據,實現需求和供應相結合,下游企業只需要幫助供應商制定計劃,從而實現下游企業零庫存,供應商的庫存也會大幅度減少,VMI要求整個供應鏈上的各個企業共享生產、銷售、需求等信息。下表為供應商管理庫存模式合作共贏例證。
[中圖分類號] R473.5 [文獻標識碼] A [文章編號] 1674-4721(2015)08(a)-0186-03
隨著人們生活水平的不斷提高,人們的健康意識不斷增強,因此對護理人員的要求也不斷提高,心血管疾病屬于內科高風險疾病之一[1],患者需要接受長期的治療,患者的臨床變化多樣,病變的隨機性強,使臨床護理風險加大,并且在護理中要求多項護理同時進行,這也對護理人員提出了更高的要求,為我國對心血管疾病在臨床護理中的突破[2],本院在最近幾年中根據該病的治療方式,在對患者的臨床護理中引入整體護理模式,現將護理的臨床對比資料整理如下,可供參考。
1 資料與方法
1.1 一般資料
2010年12月~2014年12月本院共診斷心血管疾病患者220例,年齡30~85歲,平均56.5歲,其中男性患者120例,女性患者100例,患者入院后檢查身體,無其他疾病會對本次臨床護理結果造成影響,且對患者說明本次臨床試驗,所有患者均表示愿意配合護理人員進行治療。根據不同護理方法將患者分為兩組:試驗組120例,對照組100例,兩組的一般資料差異無統計學意義(P>0.05),具有可比性。參與本次臨床護理的護士有30名,其中本科6名,大專4名,中專護士20名;護士職稱:主管護師2名,護師6名,護士20名,助理護士2名。根據患者人數,將30名護士分為兩組,其中試驗組護士20名,對照組護士10名。
1.2 護理方法
對照組護士采用常規整體護理模式進行護理,在護理中采用責任小組制度對患者進行護理[3]。試驗組實施分層級責任制整體護理模式護理,方法如下。①明確分工職責:根據本院護士情況,如職稱、文化程度、臨床經驗等成立相應的護理層級崗位,并將這些護士安排在不同的護理工作中。采用護理層級管理管理過程中主要包括4個層級,從層級大小依次為:護士長、護理組長、責任護士和助理護士,不同的層級之間護理工作明確[4]。②護理中采用分級層化分管理方式進行護理并且結合患者的臨床癥狀,將患者分為一級、二級、三級患者,隨后根據護士的等級進行護理,其中一級護士主要負責重病患者或大型手術后患者,也參與本院新技術的開發工作,一般護士主要對患者進行基本護理,患者在住院中陪同患者進行檢查工作等,在臨床護理中明確護理人員的相應工作,根據護士的個人工作能力對護士的工作進行安排[5]。③護士長在護理層級管理中發揮重要作用,其主要責任就是對全科護理工作進行有效監督和評估,并針對護理過程中可能存在的問題上報給醫院相關領導,針對性這些問題擬定相應的解決措施;護理組長則主要肩負著本科室患者的護理工作,包括患者護理方案的擬定、護士的健康指導、心理護理等,并制訂護士日常中的查房表等,及時向護士長反映患者的相關情況[6]。責任護士與患者直接接觸,其主要責任就是根據醫師對患者的診斷、治療情況等叮囑患者進行相應的護理服務項目,如護理方法的實施、護理過程中的注意事項,患者的健康指導、生活中的日常護理服務等;助理護士的工作相對比較輕松,其主要在責任護士的指導下對患者給予不同的護理服務,如陪檢、護理查房、用藥護理以及無創操作技術等多個方面的護理[7]。兩組護理時間均為1個月。
1.3 觀察指標
患者出院前對患者進行問卷調查,調查兩組患者對護理的滿意度;兩組管理質量、重病患者的管理質量、急救藥品的管理質量、基礎護理質量等指標,評分越高,說明護理效果越明顯,護理質量越高。同時,護師采用問卷調查表進行自我評價,得分越高,護師能力越強[8]。
1.4 統計學處理
數據采用SPSS 16軟件進行統計分析,計量資料用均數±標準差表示,采用t檢驗,計數資料用率表示,采用χ2檢驗,以P
2 結果
2.1 兩組護理滿意率的比較
試驗組的滿意率為95%,顯著高于對照組的85%(P
2.2 兩組護理質量評分的比較
試驗組的管理質量評分為(95.5±1.2)分,重病患者的管理質量評分為(94.6±1.2)分,急救藥品的管理質量評分為(96.8±1.2)分,基礎護理質量評分為(95.7±3.2)分,均顯著高于對照組(P
2.3 兩組護理人員自評評分的比較
試驗組的自評評分為(89.8±1.2)分,顯著高于對照組的(80.2±2.1)分(t=20.11,P
3 討論
心血管內科疾病是臨床上常見病,其發病率較高,且隨著人們生活節奏的加快其發病率呈上升趨勢,患者發病后如果得不到積極有效的治療將會誘發其他疾病,影響其生活質量。部分患者治療過程中由于缺乏理想的護理方法,使其的長期效果欠佳,治療預后較差[9]。
心血管疾病患者護理中對患者使用分層級責任制整體護理模式是主要根據本院現有的人力資源,根據護士的臨床護理能力將所有的護理工作進行分類,結合臨床實際情況與護理人員的護理水平展開的。分層級責任制整體護理模式能有效避免臨床護理中出現糾紛,并能有效提高護理質量[10]。在臨床護理的分配中將護士按層級進行分類,隨后根據患者的病情,讓適合該崗位的護理人員對患者進行護理,這就更能有效地滿足不同患者、不同疾病以及患者相關病情的需要[11]。整體護理模式結合分層級管理制度對患者進行護理,患者在入院后就有專業的護理人員進行護理,與傳統的整體護理比較,護士的工作更明確化,能提高護理人員的工作效率,對患者的病情也能有更深刻的認識,患者出現相應并發癥時,能及時上報主治醫生發病的原因,方便主治醫生對患者進行有效治療[12]。
俗話說:“字要習,馬要騎,拳腳要踢打,算盤要撥拉”。醫藥企業經營成功與否,在很大程度上有賴于管理者角色的發揮,如果管理者對自身職責認識不清,就會出現管理錯位現象,致使工作秩序混亂,日常工作漏洞百出、無法正常進行。層級越高的管理者對自身職責認識不清,產生的危害就越大。
一家致力于連鎖經營的醫藥公司成立時,總部自身的管理水平就不高,管理者對自身的管理角色的職責定位模糊,不知道哪些事該管、哪些事不該管,不明確總部對分店的關鍵控制點在哪里。該公司的高管開展的工作是中層干部的職責,而中層干部開展的則是員工的職責。隨著時間的推移,管理者中相互推諉的事情時有發生,在處理這種事情時,又說不清誰應承擔管理責任,以致有的事情就不了了之。該公司各層級管理者也提出了自己的管理困惑,反復提到:“每天都很忙,但是都忙了一些雜事,不知道該做哪些工作,不清楚該抓哪些管理,更不用提對關鍵點監督和控制了”。
藥企管理中的大忌有很多,重中之重是管理者自身職責認識不清,迷戀找感覺,缺乏全局意識,無視及無法正確實現自身價值,不能正確區分投資和成本,作繭自縛。
管理不能“被敲打”
眾所周知,無論哪個層級的管理者,其所需行使的五項基本職能都是:組織、計劃、指揮、控制、協調。層級越高,所履行職能的范圍就越廣,層級越低,所履行職能的范圍就越窄。當管理者在企業中的管理一片混亂,常常受到上級、同級或基層員工“指責、推諉、抱怨、甚至是敲打”,并且不同管理者把手伸向不在職責范圍內的員工時,也就意味著中間的管理層自動失效,意味著整個局面的失控。一個只能執行輪胎功能看到眼前路面的駕駛員駕駛汽車的后果其可想而知。乘坐一輛由這樣的駕駛員駕駛的汽車,對乘客來說考驗的不僅僅是勇氣;加入一個由這樣的管理者管理的藥企,對員工來說,面臨的不僅僅是眼前工作上的困擾。乘客離開如此駕駛的汽車是常理,頻繁面臨人事崩盤的局面對這樣的醫藥企業來說也不奇怪。
縱觀藥企興衰的種種因素,我們看到,崗位責任,層級負責,垂直管理,已經被實踐證明為有效管理的必備要件,成為管理界的共識。管理者的工作就是通過“管理”所屬員工實現組織目標。但更多的實踐證明,管理者的成功關鍵在于管理職責分明,目標清晰、科學可控的“主動推進管理。
離開或是肩負“職責”
“兵熊熊一個,將熊熊一窩”,藥企經營的命脈往往是系于管理者身上,其重要性不言而喻。然而,管理者一般是拿著高薪,享受特權,聲名赫赫,但每年還是有許多大小規模不同的藥企因為管理不善而被迫破產、關閉或重組,而其中不乏在種種管理者中,有職責不清,混沌管理者扮演著一個個不那么光彩的角色。對于此,藥企要么痛定思痛的把不懂得管理的管理者調離管理崗位,或者直接讓其走人;要么就是重新扮演好管理者的角色問題!換句話說,就是應肩負起管理者應該承擔職責,而不是經常被警告,時時處處“被敲打”認為你的管理有問題甚至是不懂管理。從管理者所處的位置和肩負的責任來看,管理者應該具有處理好以下三重職責的能力,這也是考驗一個藥企管理者是否名副其實的最主要考核指標,包括:確定藥企發展戰略方向;嚴格監督執行,加強考核;選好人,用好人,調動一切有生力量來辦事。如具備請自省,如不具備請離開。
甄別“松鼠”和“袋鼠”
管理者在主動推進管理職責時,應以“教練”身份界定員工真實情況,要甄別出“松鼠”和“袋鼠”,懂得“讓松鼠爬樹、讓袋鼠跳遠”的道理,這樣各自才能發揮所長、樂得其所。并協助員工提高他們對組織系統的了解能力,促進每個人的學習。
對于管理者自身而言,藥企同樣要做好“松鼠與袋鼠”甄別:1、全面熟悉和了解藥企的內設機構、部門職責、人員構成、分工等基本情況,從而做到胸有成竹,處事不慌。2、積極修煉“事小不輕為、事雜不亂為、事急不盲為、事難不怕為”的工作理念,對重要事項要抓住時機推進落實;對突發事項快速反饋,及時處理;對專題事項進行跟蹤了解,督查促辦;對具體事項落實到位,注重實效。3、職責服務時:為領導服務做到到位而不越位,為部門服務做到攜手而不插手;為基層服務做到主動而不被動。
責任與授權需對等
當一個人不知道他駛向哪個港口時,所有的風向都是錯誤的。管理者的權力卻是通過不斷下放而得到逐步擴大。國家治理如此,藥企管理亦如此。授權,已成為有效管理的最佳途徑。但授權有個誤區,就是在授權時只給下屬相應的責任而沒有給下屬充分的權力,這種授責不授權的做法是大錯特錯的。下屬履行其職責,必須要有相應的權力。只有責任而沒有權力,則不利于激發下屬的工作熱情,即使處理職責范圍內的問題也需不斷請示管理者,這勢必造成下屬的壓抑。只有權力而沒有責任,又可能會使下屬不恰當地濫用權力,這最終會增加藥企管理者的過程控制難度。
作為藥企管理者,如果你將某一項任務交給你的下屬去辦,那么你要充分信任你的下屬能辦好,因為信任具有無比的激勵威力,是授權的精髓和支柱。同時,授權時,一開始就應清晰地告訴員工,公司試圖達到什么目標,讓員工對授權目標有個明確的、具體的認識。依據自己的能力,邁出第一步、第二步……,直至成功。
硬指標與軟實力匹配
關鍵詞:指針;安全;管理者;職責
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2011)10-2327-03
Control Pointer with Clear Duties
SONG Zhen-fang
(Academy of Information Technology, Luoyang Normal University, Luoyang 471022, China)
Abstract: The pointer is crucial concept in C/C++ language but also is controversial and debated in software. It has realistic meanings for software safety to improve the safety of using a pointer.The pointer is direct manager of memory and it is transferred in a program as function parameters causes memory constantly with new managers. Programmers cognizant of the different responsibilities of managers and manipulate pointers to control memory can improve the program’s bined with concrete example to analysis its effectiveness.
Key words: pointer; safety; manager; duty
指針是C/C++語言區別于其他高級語言的主要標志之一。指針的靈活性賦予程序員強大控制能力的同時也因其難以駕馭而帶來軟件安全的潛在隱患。知彼知己,百戰不殆,欲駕馭指針首先要了解指針,弄清使用指針的目的,然后在控制指針的時候才能真正注意到一些細節問題,而細節常常是安全隱患之所在。對高可信軟件需求的增加使得指針程序的驗證成為近期的研究熱點,不少研究者專注于如何對指針程序進行精確的分析,如文獻[1-3]等對此問題進行了深入研究。本文從管理者職責的角度談指針的控制,由于指針涉及到的概念比較多,需要學習和探討的內容豐富,在內容上側重于分析通過指針申請內存和釋放內存的問題。
首先介紹指針概念、強調管理理念和提出管理者職責概念,然后結合幾個應用背景不同的案例分析如何理清管理者職責,達到明明白白控制指針的目的。
1 認識指針
1.1 指針相關概念
把數據比作演員,內存比作演員表演的舞臺,則程序員就相當于導演。導演指揮演員上下舞臺需要知道演員的名字,數據的名字就是變量名,變量名實際上傳遞了內存地址信息,內存地址又被稱作變量地址(即指針),存放指針的變量稱為指針變量。
程序員是程序的導演,是程序的最高管理者,而指針是內存單元空間的直接控制者。對于程序員來講,無論是采用結構化方法或面向對象方法進行程序的分析與設計,應該意識到指針做為參數進行傳遞導致了內存單元的控制者不斷增加,究竟誰應該對內存單元空間的申請和釋放負責,是指針應用安全性的關鍵。許多程序員就是因為沒有搞清楚這一點,在程序代碼編寫過程中埋下了許多指針隱患。所以,結構化編程要弄清模塊的職責,面向對象編程要弄清類對象的職責,職責分明就可以做到對指針的精確控制,最大程度地避免種種使用指針帶來的問題。
1.2 指針常見問題
1) 指針在使用前必須進行初始化
好的習慣是聲明一個指針的同時為其賦值NULL,如int *ptr=NULL,否則系統會讓指針指向一個隨機的內存單元,如果該地址正被系統使用著,程序員冒然去使用該指針做操作就會帶來不可預知的錯誤。
2) 內存泄露
程序員使用指針在堆上創建動態一維或多維動態數組[4],程序結束時忘記釋放堆上的內存空間,或者因為指針轉而指向其他內存空間導致已被申請的內存單元失去了管理者,均會造成內存泄露。
3) 迷途指針
迷途指針也叫野指針或者懸浮指針。迷途指針的出現常常是因為將delete用于該指針后,刪除了它所指的內存但沒有將它設置為空引發的。如果程序員隨后沒有重新對其賦值的情況下使用該指針也會引發錯誤。
4) 重復delete問題
使用指針控制內存單元時經常會出現多個指針指向同一塊內存單元,即擁有多個管理者的情況,如果該內存單元已經被某個管理者釋放,其它管理者還要再次去釋放就會出現重復delete問題。
一個簡單的例子如下所示。
class A{};
void main()
{
A *ptr1=new A;
A *ptr2=ptr1;
delete ptr1;
delete ptr2;
}
上述代碼中ptr1是堆上內存單元的管理者,ptr2也是它的管理者,將delete應用于ptr1實現了堆上內存的釋放,再將delete應用于ptr2時就導致了重復delete問題的產生。
5) 指針傳遞的錯覺
程序員定義了一個指針變量,然后以該指針變量為函數實參調用函數,以期在該函數體內實現內存空間的申請,但發現函數調用完畢后通過該指針變量去管理內存單元卻發生錯誤。具體代碼如下所示。
void Create(int*) ;
void main()
{int *ptr=NULL;
Create(ptr);
*ptr=10;
cout
delete ptr;
ptr=NULL;
}void Create(int* p)
{p=new int;
}
粗看代碼,ptr指針變量做了正確的初始化,使用delete ptr回收了內存單元,最后又將ptr賦值為NULL避免了迷途指針,似乎很完美,但運行代碼卻出現了錯誤。參看圖1所示進行分析。
從圖中可以清晰看出ptr在函數調用前后始終是值為NULL的空指針。解決該問題方法參見后面的2.1節內容。
關于指針涉及到的問題很多,本文無意于面面俱到,接下來結合不同應用背景的案例從管理者職責的角度分析通過指針申請內存和釋放內存的過程中如何避免上述問題的發生。
2 指針應用案例
2.1 指針傳遞錯覺問題的解決
為了敘述的方便,提出客戶方和服務方的概念,本文后面將沿用該稱謂。客戶方是指需求的產生方或者是調用方,服務方是指滿足需求的一方或者是被調用方。如在前圖1所示的案例中,main()函數稱為客戶方,Create()函數稱為服務方。
在圖1所示的案例中,客戶方提出要使用堆上內存空間的需求,服務方負責申請堆上內存用于滿足客戶方。通過分析圖1發現客戶方的需求并沒有得到滿足。弄清了客戶方和服務方彼此的職責后,應首先畫出如圖2所示的正確內存狀況圖。
然后如下所示進行代碼的改寫。
void Create(int**);
void main()
{int *ptr=NULL;
Create(&ptr);
*ptr=10;
cout
}void Create(int** p)
{*p=new int;
}
2.2 動態鏈表討論
指針在動態鏈表的實現中起著舉足輕重的作用。常規的動態鏈表[5]是由兩個密切配合的類相互協調實現的。這兩個類是鏈表結點類和鏈表類,分別用ListNode和List表示。為了突出兩者角色的不同,稱ListNode為ListNode“員工類”、List為List“管理者類”。List“管理者類”和ListNode“員工類”進行協調共同為客戶方提供服務。ListNode“員工類”的兩個數據成員分別用int data和ListNode* link表示,List“管理者類”的數據成員用ListNode* head表示。常規的動態鏈表應用案例如下代碼所示。
#include "list.h"
void main()
{
List alist;
for (int i=0;i
alist.InsertTail(i+1);
alist.Print();
}
在代碼中main()函數代表客戶方,alist對象代表服務方,那么內存空間的申請和釋放是如何分工實現的呢?
客戶方在棧上生成了alist對象,并負責析構alist對象所占據的內存空間。服務方alist對象負責堆上內存空間的申請和釋放,服務方alist對象在被銷毀時,其析構函數負責了堆上內存空間的釋放。接下來我們將main()函數做如下所示的代碼修改。
#include "list.h"http://list.h中有#include "listnode.h"語句
void main()
{
List alist;
ListNode* pListNode=NULL;
for (int i=0;i
pListNode=new ListNode(i+1);
alist.InsertTail(pListNode);
}
pListNode=NULL;
alist.Print();
}
觀察客戶方的需求,發現有以下變化:①客戶方直接操控ListNode“員工類”,在堆上申請了內存空間;②客戶方負責將pListNode指針置空值,防止迷途指針的出現;③服務方alist 對象不用考慮堆上內存空間的申請,而只考慮堆上內存空間的釋放。
2.3 動態鏈表的進一步討論
客戶方和服務方是一個相對的概念,應該動態靈活地看待它。前面對動態鏈表的討論限于最高層,現在我們把注意力集中在動態鏈表的內部,考慮List“管理者類”和ListNode“員工類”的協調配合關系。它們兩者均擁有指針,都是內存的管理者,所以弄清List“管理者類”和ListNode“員工類”各自的職責也就弄清了兩者的配合關系。在常規的動態鏈表中,L istNode“員工類”不考慮堆上內存空間的申請和釋放問題,這些工作都交給List“管理者類”去完成。但是我們可以改變設計的方案,比如,讓L istNode“員工類”和List“管理者類”配合共同完成堆上內存空間的釋放。L istNode“員工類”和List“管理者類”的析構函數代碼如下所示。
ListNode::~ListNode()
{
if (this->pNextListNode)
delete pNextListNode;
}
List::~List()
{
if (this->head)
delete this->head;
}
從代碼中可以清晰地看出,鏈表類對象alist在棧上被銷毀時調用它的析構函數,該析構函數非常簡單,只是對鏈表的頭指針應用delete操作,該操作導致鏈表的第一個結點被銷毀,因而又會調用L istNode“員工類”對象(結點)的析構函數,該過程一直傳遞下去構成遞歸關系,非常優雅地實現了內存空間的釋放功能。
3 結束語
指針是C/C++語言中靈活而重要的工具,使用指針可以實現靈活的數據結構。本文概述了指針常見問題,并重點分析了用管理者職責的概念去幫助程序員理清動態鏈表中控制指針的思路。指針涉及到的內容豐富,但只要程序員抓住指針控制內存的本質,以職責為線索進行思索,就比較容易建立清晰的思路控制指針,提高程序的安全性。該方法在編程實踐中具有良好的效果。
參考文獻:
[1] 張廣梅,李曉維.動態內存錯誤的靜態檢測[J].計算機輔助設計與圖形學學報,2005(3).
[2] 徐厚峰.空指針解引用靜態檢測方法研究[D].長沙:國防科學技術大學,2008.
[3] 柯平. 內存泄漏靜態檢測模型的設計與實現[D].北京:北京郵電大學,2009.