亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 2958 | 回復(fù): 14
打印 上一主題 下一主題

[C++] 這個是怎么回事? 新手求解~~~ [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2014-11-02 14:27 |只看該作者 |倒序瀏覽
class A{
private:
   int i;

public:
   A(){this->i = 2;}
  void hello(){printf("hello is %d",i);}
void helloworld(){printf("hello world");}
}


int main(){
A *p = new A();
p =NULL;
p -> helloworld();
p ->hello();

return 0;
}
結(jié)果:   hello world  
           segment fault :11
為什么第一個函數(shù)調(diào)用成功。第二個失? 大概我知道p = NULL 后 數(shù)據(jù)段清空  在調(diào)函數(shù)hello()時 數(shù)據(jù)i已經(jīng)消失 所以會報 數(shù)據(jù)段溢出錯誤。

我的問題:1.    p = NULL    是將指針P指向的堆清0  還是重新指向一個為0的堆?
              2.    p = NULL  后數(shù)據(jù)段 清零 數(shù)據(jù)i內(nèi)存沒了。 為什么指針p還能找到 函數(shù)并能 壓入棧?

論壇徽章:
24
金牛座
日期:2013-08-21 07:55:52射手座
日期:2014-09-29 15:36:14摩羯座
日期:2014-10-07 21:42:57天秤座
日期:2014-10-16 10:03:00午馬
日期:2014-10-19 13:40:31酉雞
日期:2014-11-08 08:44:54處女座
日期:2014-11-10 17:01:21午馬
日期:2014-12-06 16:52:38羊年新春福章
日期:2015-02-12 17:41:512015年迎新春徽章
日期:2015-03-04 09:58:1115-16賽季CBA聯(lián)賽之廣夏
日期:2022-10-07 19:41:11巳蛇
日期:2014-09-13 15:29:54
2 [報告]
發(fā)表于 2014-11-02 16:53 |只看該作者
本帖最后由 wangspace 于 2014-11-02 16:57 編輯

class 以分號結(jié)束
在說你這寫C++怎么還用printf ?

論壇徽章:
24
金牛座
日期:2013-08-21 07:55:52射手座
日期:2014-09-29 15:36:14摩羯座
日期:2014-10-07 21:42:57天秤座
日期:2014-10-16 10:03:00午馬
日期:2014-10-19 13:40:31酉雞
日期:2014-11-08 08:44:54處女座
日期:2014-11-10 17:01:21午馬
日期:2014-12-06 16:52:38羊年新春福章
日期:2015-02-12 17:41:512015年迎新春徽章
日期:2015-03-04 09:58:1115-16賽季CBA聯(lián)賽之廣夏
日期:2022-10-07 19:41:11巳蛇
日期:2014-09-13 15:29:54
3 [報告]
發(fā)表于 2014-11-02 17:16 |只看該作者
你寫的代碼
A *p = new A();  //創(chuàng)建一個對象,p保存對象在堆中的地址
p = NULL;    //p指針現(xiàn)在為NULL,以不指向你剛創(chuàng)建的對象,你對對象的成員還怎么操作?

論壇徽章:
0
4 [報告]
發(fā)表于 2014-11-02 17:23 |只看該作者
回復(fù) 3# wangspace


    那為什么還能正常調(diào)用p -> helloworld();  正常打。
      hello world

論壇徽章:
24
金牛座
日期:2013-08-21 07:55:52射手座
日期:2014-09-29 15:36:14摩羯座
日期:2014-10-07 21:42:57天秤座
日期:2014-10-16 10:03:00午馬
日期:2014-10-19 13:40:31酉雞
日期:2014-11-08 08:44:54處女座
日期:2014-11-10 17:01:21午馬
日期:2014-12-06 16:52:38羊年新春福章
日期:2015-02-12 17:41:512015年迎新春徽章
日期:2015-03-04 09:58:1115-16賽季CBA聯(lián)賽之廣夏
日期:2022-10-07 19:41:11巳蛇
日期:2014-09-13 15:29:54
5 [報告]
發(fā)表于 2014-11-02 17:29 |只看該作者
雖然將P=NULL,但p指針還指向內(nèi)存中創(chuàng)建對象的原始位置

論壇徽章:
0
6 [報告]
發(fā)表于 2014-11-02 17:31 |只看該作者
回復(fù) 3# wangspace


    我知道 我這個不是按 C++ 規(guī)范編寫。

只是想 探尋一下 C++ 內(nèi)部機制。

指針 指向的堆  分配一段內(nèi)存。
然后= NULL后,指針指向一個 0的內(nèi)存 空間。
但是 這時候 問什么 指針P 還能正常 調(diào) 函數(shù)。

如果函數(shù)不包含 類數(shù)據(jù),則能正常運行 否則 會crash。

論壇徽章:
24
金牛座
日期:2013-08-21 07:55:52射手座
日期:2014-09-29 15:36:14摩羯座
日期:2014-10-07 21:42:57天秤座
日期:2014-10-16 10:03:00午馬
日期:2014-10-19 13:40:31酉雞
日期:2014-11-08 08:44:54處女座
日期:2014-11-10 17:01:21午馬
日期:2014-12-06 16:52:38羊年新春福章
日期:2015-02-12 17:41:512015年迎新春徽章
日期:2015-03-04 09:58:1115-16賽季CBA聯(lián)賽之廣夏
日期:2022-10-07 19:41:11巳蛇
日期:2014-09-13 15:29:54
7 [報告]
發(fā)表于 2014-11-02 17:33 |只看該作者
回復(fù) 6# changkaizhao
我想還是應(yīng)該把最基本的搞懂,我也是初學(xué)者


   

論壇徽章:
0
8 [報告]
發(fā)表于 2014-11-02 17:38 |只看該作者
回復(fù) 5# wangspace


    = NULL后 并不是 沒變 ,地址會 變?yōu)?

論壇徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大;照
日期:2013-04-17 11:02:15CU大;照
日期:2013-04-17 11:02:36CU大;照
日期:2013-04-17 11:02:58技術(shù)圖書徽章
日期:2013-12-04 10:48:50酉雞
日期:2014-01-03 10:32:30辰龍
日期:2014-03-06 15:04:07
9 [報告]
發(fā)表于 2014-11-02 17:39 |只看該作者
本帖最后由 shan_ghost 于 2014-11-02 17:48 編輯

1、“堆”泛指“可動態(tài)分配的存儲區(qū)”; 指針 (void *) 0 或 NULL 指向的不是堆。

最好不要在談?wù)揷時濫用堆這個概念。事實上,c/c++相關(guān)標(biāo)準(zhǔn)并沒有提及堆這個概念。

尤其是對某個概念沒有清晰的認識時,更要盡量避免使用它。很容易扯出一堆亂麻的。



2、指針是一個“存儲一個地址值”的變量。修改這個變量除了改變指針的指向外,并不會帶來什么神奇變化。牢記這一點。
換句話說,p = NULL 后 數(shù)據(jù)段清空是無稽之談;它之后,你原來new的那塊內(nèi)存就不再能訪問了,但里面的內(nèi)容卻不會消失,那塊區(qū)域在進程退出前也不再能重用——這也叫“內(nèi)存泄漏”。


3、調(diào)用函數(shù)時,只是函數(shù)參數(shù)入棧,和函數(shù)入口地址沒什么關(guān)系。


總的來說,樓主并沒有真正理解指針、堆、棧等等基礎(chǔ)概念,建議多看一些比較可靠的書,把基礎(chǔ)補一補。就著錯誤的概念發(fā)揮是非常危險的。

事實上,你最好趕緊回去看書。后面的東西,在你補足基礎(chǔ)前是不可能真正看懂的。



4、類 和 對象 不是一碼事。你可以認為類信息(包括靜態(tài)變量、成員函數(shù)表以及成員函數(shù)本身在代碼段中的位置等)是全局唯一的;而對象是類的實例,每個實例都會占據(jù)特定的一塊內(nèi)存。

所以,任何時候,調(diào)用任何類成員函數(shù),都不會有問題;但是,如果傳給成員函數(shù)的參數(shù)值有問題,成員函數(shù)當(dāng)然還是有可能會崩潰。

注意類成員函數(shù)有一個默認的隱藏參數(shù),即this。p->hello(),其實在編譯器眼里,是hello(p);同樣的,在hello里面用到的i,實質(zhì)上是this->i;對你的代碼,也就是p->i。

你的代碼把p指向NULL,這就是一個無效指針。所以一旦通過p訪問i的內(nèi)容就會出現(xiàn)段錯誤——這是執(zhí)行p->hello()里面的邏輯時出錯,并不是調(diào)用p->hello()出錯了。
而helloworld()并沒有去訪問p指向的地址,所以執(zhí)行它并不會崩潰。

你可以通過單步執(zhí)行驗證這一點。

論壇徽章:
59
2015年亞洲杯之約旦
日期:2015-01-27 21:27:392015年亞洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵節(jié)徽章
日期:2015-03-06 15:50:392015年亞洲杯之阿聯(lián)酋
日期:2015-03-19 17:39:302015年亞洲杯之中國
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03雙子座
日期:2014-12-10 21:39:16處女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
10 [報告]
發(fā)表于 2014-11-02 17:44 |只看該作者
因為
p -> helloworld();
沒有訪問 p指向的內(nèi)容,
成員函數(shù)地址并沒有保存在類中,
不需要通過基地址訪問。
但成員的函數(shù)變量是保存在類中的。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP