青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 14, comments - 4, trackbacks - 0, articles - 0

野指針

Posted on 2006-07-05 00:32 will 閱讀(1279) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 技術(shù)探索
?????????野指針,也就是指向不可用內(nèi)存區(qū)域的指針。通常對(duì)這種指針進(jìn)行操作的話,將會(huì)使程序發(fā)生不可預(yù)知的錯(cuò)誤。但是,我在文中要說(shuō)的,就是野指針的“安全”使用方法以及其內(nèi)部的原因.

首先請(qǐng)諸位看以下一段“危險(xiǎn)”的C++代碼:

void?function(?void?)
{
????char*?str?=?new?char[100];
????delete[]?str;
????//?Do?something
????strcpy(?str,?"Dangerous!!"?);
}

之所以說(shuō)其危險(xiǎn),是因?yàn)檫@是一段完全合乎語(yǔ)法的代碼,編譯的時(shí)候完美得一點(diǎn)錯(cuò)誤也不會(huì)有,然而當(dāng)運(yùn)行到strcpy一句的時(shí)候,問(wèn)題就會(huì)出現(xiàn),因?yàn)樵谶@之前,str的空間已經(jīng)被delete掉了,所以strcpy當(dāng)然不會(huì)成功。對(duì)于這種類(lèi)似的情況,在林銳博士的書(shū)中有過(guò)介紹,稱其為“野指針”。

那么,諸位有沒(méi)有見(jiàn)過(guò)安全的“野指針”呢?下面請(qǐng)看我的一段C++程序,靈感來(lái)自CSDN上的一次討論。在此,我只需要C++的“類(lèi)”,C++的其余一概不需要,因此我沒(méi)有使用任何的C++標(biāo)準(zhǔn)庫(kù),連輸出都是用printf完成的。

#include?<stdio.h>

class?CTestClass
{
public:
????CTestClass(?void?);
????int?m_nInteger;
????void?Function(?void?);
};

CTestClass::CTestClass(?void?)
{
????m_nInteger?=?0;
}

void?CTestClass::Function(?void?)
{
????printf(?"This?is?a?test?function.\n"?);
}

void?main(?void?)
{
????CTestClass*?p?=?new?CTestClass;
????delete?p;
????p->Function();
}

OK,程序到此為止,諸位可以編譯運(yùn)行一下看看結(jié)果如何。你也許會(huì)驚異地發(fā)現(xiàn):沒(méi)有任何的出錯(cuò)信息,屏幕上竟然乖乖地出現(xiàn)了這么一行字符串:

This is a test function.

奇怪嗎?不要急,還有更奇怪的呢,你可以把主函數(shù)中加上一句更不可理喻的:

((CTestClass*)NULL)->Function();

這仍然沒(méi)有問(wèn)題!!

我這還有呢,哈哈。現(xiàn)在你在主函數(shù)中這么寫(xiě),倘說(shuō)上一句不可理喻,那么以下可以叫做無(wú)法無(wú)天了:

int?i?=?888;
CTestClass*?p2?=?(CTestClass*)&i;
p2->Function();

你看到了什么?是的,“This is a test function.”如約而至,沒(méi)有任何的錯(cuò)誤。

你也許要問(wèn)為什么,但是在我解答你之前,請(qǐng)你在主函數(shù)中加入如下代碼:

printf(?"%d,?%d",?sizeof(?CTestClass?),?sizeof(?int?)?);

這時(shí)你就會(huì)看到真相了:輸出結(jié)果是——得到的兩個(gè)十進(jìn)制數(shù)相等。對(duì),由sizeof得到的CTestClass的大小其實(shí)就是它的成員m_nInteger的大小。亦即是說(shuō),對(duì)于CTestClass的一個(gè)實(shí)例化的對(duì)象(設(shè)為a)而言,只有a.m_nInteger是屬于a這個(gè)對(duì)象的,而a.Function()卻是屬于CTestClass這個(gè)類(lèi)的。所以以上看似危險(xiǎn)的操作其實(shí)都是可行且無(wú)誤的。

現(xiàn)在你明白為什么我的“野指針”是安全的了,那么以下我所列出的,就是在什么情況下,我的“野指針”不安全:

  1. 在成員函數(shù)Function中對(duì)成員變量m_nInteger進(jìn)行操作;
  2. 將成員函數(shù)Function聲明為虛函數(shù)(virtual)。

以上的兩種情況,目的就是強(qiáng)迫野指針使用屬于自己的東西導(dǎo)致不安全,比如第一種情況中操作本身的m_nInteger,第二種情況中變?yōu)樘摵瘮?shù)的Function成為了屬于對(duì)象的函數(shù)(這一點(diǎn)可以從sizeof看出來(lái))。

其實(shí),安全的野指針在實(shí)際的程序設(shè)計(jì)中是幾乎毫無(wú)用處的。我寫(xiě)這一篇文章,意圖并不是像孔乙己一樣去琢磨回字有幾種寫(xiě)法,而是想通過(guò)這個(gè)小例子向諸位寫(xiě)明白C++的對(duì)象實(shí)例化本質(zhì),希望大家不但要明白what和how,更要明白why。李馬二零零三年二月二十日作于自宅。


關(guān)于成員函數(shù)CTestClass::Function的補(bǔ)充說(shuō)明

這個(gè)函數(shù)是一個(gè)普通的成員函數(shù),它在編譯器的處理下,會(huì)成為類(lèi)似如下的代碼:

void?Function(?const?CTestClass?*?this?)?//?①
{
????printf("This?is?a?test?function.\n");
}

那么p->Function();一句將被編譯器解釋為:

Function( p );

這就是說(shuō),普通的成員函數(shù)必須經(jīng)由一個(gè)對(duì)象來(lái)調(diào)用(經(jīng)由this指針激活②)。那么由上例的delete之后,p指針將會(huì)指向一個(gè)無(wú)效的地址,然而p本身是一個(gè)有效的變量,因此編譯能夠通過(guò)。并且在編譯通過(guò)之后,由于CTestClass::Function的函數(shù)體內(nèi)并未對(duì)這個(gè)傳入的this指針進(jìn)行任何的操作,所以在這里,“野指針”便成了一個(gè)看似安全的東西。

然而若這樣改寫(xiě)CTestClass::Function:

void?CTestClass::Function(?void?)
{
????m_nInteger?=?0;
}

那么它將會(huì)被編譯器解釋為:

void?Function(?const?CTestClass?*?this?)
{
????this->m_nInteger?=?0;
}

你看到了,在p->Function();的時(shí)候,系統(tǒng)將會(huì)嘗試在傳入的這個(gè)無(wú)效地址中尋找m_nInteger成員并將其賦值為0,剩下的我不用說(shuō)了——非法操作出現(xiàn)了。

至于virtual虛函數(shù),如果在類(lèi)定義之中將CTestClass聲明為虛函數(shù):

class?CTestClass
{
public:
????//?...
????virtual?void?Function(?void?);
};

那么C++在構(gòu)建CTestClass類(lèi)的對(duì)象模型時(shí),將會(huì)為之分配一個(gè)虛函數(shù)表vptr(可以從sizeof看出來(lái))。vptr是一個(gè)指針,它指向一個(gè)函數(shù)指針的數(shù)組,數(shù)組中的成員即是在CTestClass中聲明的所有虛函數(shù)。在調(diào)用虛函數(shù)的時(shí)候,必須經(jīng)由這個(gè)vptr,這也就是為什么虛函數(shù)較之普通成員函數(shù)要消耗一些成本的緣故。以本例而言,p->Function();一句將被編譯器解釋為:

(*p->vptr[1])(?p?);?//?調(diào)用vptr表中索引號(hào)為1的函數(shù)(即Function)③

上面的代碼已經(jīng)說(shuō)明了,如果p指向一個(gè)無(wú)效的地址,那么必然會(huì)有非法操作。

備注:

①關(guān)于函數(shù)的命名,我采用了原名而沒(méi)有變化。事實(shí)上編譯器為了避免函數(shù)重載造成的重名情況,會(huì)對(duì)函數(shù)的名字進(jìn)行處理,使之成為獨(dú)一無(wú)二的名稱。
②將成員函數(shù)聲明為static,可以使成員函數(shù)不經(jīng)由this指針便可調(diào)用。
③vptr表中,索引號(hào)0為類(lèi)的type_info。



青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧洲美洲综合色网| 亚洲欧美日本日韩| 欧美在线观看视频在线| 亚洲看片网站| 9i看片成人免费高清| 一本一道久久综合狠狠老精东影业| 亚洲理论电影网| 亚洲少妇最新在线视频| 亚洲一区尤物| 久久福利毛片| 欧美风情在线| 一本久久综合亚洲鲁鲁五月天| 99这里只有精品| 性欧美超级视频| 老鸭窝毛片一区二区三区| 欧美激情第8页| 欧美网站在线观看| 国产综合亚洲精品一区二| 91久久精品一区二区三区| 在线亚洲免费| 午夜精品久久久久99热蜜桃导演| 午夜激情综合网| 久久久噜噜噜久久狠狠50岁| 欧美1区3d| 在线性视频日韩欧美| 欧美在线视频在线播放完整版免费观看 | 亚洲高清自拍| 一区二区三区欧美亚洲| 久久美女性网| 一区二区三区国产在线| 久久久精品日韩欧美| 欧美日韩亚洲国产精品| 精久久久久久久久久久| 亚洲欧美一区二区在线观看| 久久一区二区视频| 在线亚洲一区观看| 欧美成人日本| 一区二区在线观看av| 亚洲一二三区在线| 欧美高潮视频| 久久久久久久网站| 国产日韩欧美综合在线| 亚洲一区二区三区精品在线| 欧美大片免费| 久久亚洲不卡| 国产一区二区久久久| 亚洲影院免费观看| 亚洲人成77777在线观看网| 香蕉久久精品日日躁夜夜躁| 欧美色区777第一页| 亚洲美女色禁图| 欧美成人精品1314www| 欧美一区久久| 国产亚洲激情| 久久国产精品一区二区三区四区| 在线综合视频| 国产精品人人做人人爽| 亚洲一区免费视频| 夜夜嗨av色综合久久久综合网| 欧美成人午夜激情| 亚洲免费av片| 日韩午夜激情电影| 欧美日韩国产a| 一区二区三区精密机械公司| 91久久精品国产91久久性色tv | 久久激情网站| 国产在线精品一区二区夜色| 久久成人一区二区| 欧美一区二区三区精品| 欧美日韩国产综合在线| 亚洲日本中文字幕区| 免费人成精品欧美精品| 亚洲日本精品国产第一区| 亚洲国产精品ⅴa在线观看| 欧美成在线观看| 夜夜夜精品看看| 一区二区三区.www| 国产欧美精品久久| 美女视频黄免费的久久| 欧美.www| 亚洲综合国产| 午夜亚洲性色视频| 亚洲高清在线视频| 日韩一级二级三级| 国产精品人人做人人爽人人添| 久久精品一二三区| 欧美二区在线观看| 亚洲摸下面视频| 欧美一区久久| 亚洲久久在线| 亚洲综合精品四区| 亚洲黄色在线| 亚洲图片欧美午夜| 在线免费高清一区二区三区| 亚洲另类在线视频| 韩国免费一区| 亚洲精品资源| 国外成人在线| 妖精成人www高清在线观看| 国内成人精品2018免费看| 亚洲高清123| 国产精品爽黄69| 欧美激情一区二区三级高清视频| 欧美性猛交xxxx乱大交蜜桃| 老司机精品视频网站| 欧美日韩免费一区二区三区视频 | 欧美一级专区| 一区二区冒白浆视频| 欧美伊久线香蕉线新在线| 日韩一区二区免费高清| 久久爱www久久做| 亚洲午夜精品| 欧美电影在线观看| 久久久天天操| 国产精品亚洲综合| 日韩亚洲在线观看| 亚洲精品美女| 久久riav二区三区| 欧美诱惑福利视频| 国产精品国产精品国产专区不蜜| 欧美bbbxxxxx| 国产亚洲欧美日韩精品| 一区二区三区四区五区精品| 亚洲人成人一区二区三区| 欧美一区二区三区播放老司机| 亚洲一区二区三区精品动漫| 欧美精品一卡二卡| 欧美激情在线播放| 亚洲国产精品一区在线观看不卡| 欧美一区二区三区在线播放| 亚洲女女做受ⅹxx高潮| 欧美.www| 欧美日韩视频在线第一区| 蜜桃av一区二区| 国产亚洲精品久久久| 亚洲欧美资源在线| 欧美亚洲三级| 国产欧美欧美| 欧美亚洲一区二区三区| 欧美在线视频a| 国产区亚洲区欧美区| 亚洲自拍偷拍麻豆| 久久国产精品99国产精| 国产嫩草一区二区三区在线观看| 中日韩美女免费视频网址在线观看 | av不卡在线观看| 欧美久久久久久蜜桃| 亚洲国产欧美在线人成| 91久久在线播放| 欧美日韩国产精品自在自线| 亚洲美女免费精品视频在线观看| 99re6这里只有精品| 欧美日韩高清在线| 亚洲一区二区三区久久| 久久xxxx精品视频| 在线观看欧美成人| 欧美精品一区二区三区一线天视频| 亚洲激情在线| 亚洲欧美久久久| 韩国一区电影| 欧美刺激午夜性久久久久久久| 亚洲人成免费| 午夜精品久久久久久久久久久久久| 国产日韩欧美a| 久热成人在线视频| 亚洲精品日韩欧美| 久久精品女人| 亚洲精品视频一区| 国产精品推荐精品| 久久一区激情| 99精品视频一区二区三区| 久久精品人人做人人综合| 亚洲激情校园春色| 国产精品性做久久久久久| 久久亚洲风情| 亚洲在线播放电影| 欧美激情精品久久久久久免费印度| 亚洲视频一区在线观看| 国产主播一区二区三区| 欧美日韩123| 久久精品国产欧美亚洲人人爽| 亚洲国产高清一区| 久久福利毛片| 亚洲综合精品自拍| 亚洲国产清纯| 国产午夜精品久久久久久免费视 | 在线亚洲精品福利网址导航| 国产一区免费视频| 欧美午夜精品一区| 久热re这里精品视频在线6| 亚洲影院色无极综合| 国产精品卡一卡二卡三| 欧美裸体一区二区三区| 亚洲福利免费| 日韩天堂在线观看| 国产免费亚洲高清| 欧美国产大片| 久久成人18免费观看| 日韩视频免费在线| 六月婷婷一区|