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

Chinaunix

標(biāo)題: delete何時開始生效。 [打印本頁]

作者: renstone921    時間: 2005-08-07 14:08
標(biāo)題: delete何時開始生效。
本來我認(rèn)為當(dāng)對一個使用new分配的變量進(jìn)行delete后,該變量就應(yīng)當(dāng)立即失效了.但使用以下的代碼作測試,結(jié)果卻不是我所預(yù)期的.

  1. #include <iostream>;

  2. using namespace std;

  3. class Cat
  4. {
  5. public:
  6.         Cat()
  7.         {
  8.                 cout << "\n Cat Constructs\n";
  9.         }

  10.         ~Cat()
  11.         {
  12.                 cout << "\n Cat Destructs\n";
  13.         }

  14.         void sleep()
  15.         {
  16.                 cout << "\nI'm sleeping\n";
  17.         }

  18.         void speek()
  19.         {
  20.                 cout << "\nMEOW!\n";
  21.         }

  22.         void eat()
  23.         {
  24.                 cout << "\nWhere is the mouse!\n";
  25.         }
  26. };
  27.        

  28. int main()
  29. {
  30.         Cat* cat = new Cat();
  31.         if (NULL == cat)
  32.                 return -1;
  33.         delete cat;
  34.         cat->;eat();                //Works;
  35.         return (0);
  36. }
復(fù)制代碼

輸出:
Cat Constructs

Cat Destructs

Where is the mouse!
有兄弟能幫我解釋一下嗎?
作者: luojiannx    時間: 2005-08-07 14:27
標(biāo)題: delete何時開始生效。
估計delete cat只是調(diào)用了析構(gòu)函數(shù), 而析構(gòu)函數(shù)一般用來釋放資源
但是cat指針仍然在程序里面
并沒有如你所愿變成NULL(cat 并不是malloc分派空間)
所以仍然可以調(diào)用,但是不能訪問已經(jīng)釋放掉的資源
你沒申請什么資源, 所以應(yīng)該就是你看到的樣子
作者: 藍(lán)白725    時間: 2005-08-07 14:27
標(biāo)題: delete何時開始生效。
你如果在Cat類中加一個數(shù)據(jù)成員,并在構(gòu)造函數(shù)中將其賦個初值,然后,在delete之后看看那個數(shù)據(jù)成員的值就會發(fā)現(xiàn)delete的效果了。
不管是delete還是free,都不會將指針置為NULL,所以,良好的習(xí)慣是在delete或free或立即將指針置為NULL,否則就會有野指針的問題了。
作者: renstone921    時間: 2005-08-07 14:37
標(biāo)題: delete何時開始生效。

  1. #include <iostream>;

  2. using namespace std;

  3. class Cat
  4. {
  5. public:
  6.         Cat(int val)
  7.         {
  8.                 value = val;
  9.                 cout << "\n Cat Constructs\n";
  10.         }

  11.         ~Cat()
  12.         {
  13.                 cout << "\n Cat Destructs\n";
  14.         }

  15.         void sleep()
  16.         {
  17.                 cout << "\nI'm sleeping\n";
  18.         }

  19.         void speek()
  20.         {
  21.                 cout << "\nMEOW!\n";
  22.         }

  23.         void eat()
  24.         {
  25.                 cout << "\nWhere is the mouse!\n";
  26.         }
  27. private:
  28.         int value;                       
  29. };
  30.        

  31. int main()
  32. {
  33.         Cat* cat = new Cat(10);
  34.         if (NULL == cat)
  35.                 return -1;
  36.         delete cat;
  37.        
  38.         int* tmp = new int[100000];
  39.         if (NULL ==tmp)
  40.                 return (-1);
  41.         *tmp = 100;
  42.         delete []tmp;
  43.         cat->;eat();                //Works;
  44.         return (0);
  45. }

復(fù)制代碼

修改后結(jié)果:

Cat Constructs

Cat Destructs

Where is the mouse!
我也知道應(yīng)當(dāng)是無效的,但不知怎么會出現(xiàn)這種結(jié)果.會不會是因為這是在C++中沒有定義的行為.
作者: gvim    時間: 2005-08-07 14:44
標(biāo)題: delete何時開始生效。
改成下面再試試
  void eat()
   {
      value++;
      cout << "\nWhere is the mouse!\n";
   }
作者: renstone921    時間: 2005-08-07 15:03
標(biāo)題: delete何時開始生效。
還是一樣
作者: gvim    時間: 2005-08-07 15:26
標(biāo)題: delete何時開始生效。
不好意思,是我大意看錯了。我說成以前遇到的情況了:

  1. #include <iostream>;
  2. using namespace std;
  3. class Cat
  4. {
  5.         public:
  6.                 void eat()
  7.                 {
  8.                                                 //value++;     //this is the fault
  9.                         cout << "\nWhere is the mouse!\n";
  10.                 }
  11.         private:
  12.                 int value;         
  13. };
  14. int main()
  15. {
  16.         Cat* cat;
  17.         cat->;eat();      //Works;
  18.         return (0);
  19. }
復(fù)制代碼

你說的情況,還真是如你所說,,,一會想想看。
作者: mq110    時間: 2005-08-07 15:42
標(biāo)題: delete何時開始生效。
野指針.
作者: BabyBlue    時間: 2005-08-08 09:00
標(biāo)題: delete何時開始生效。
delete成功后只是給那塊內(nèi)存做個可以回收的標(biāo)記,并不馬上清空。
你通過原來的指針還是可以看到里面的東東,就像你寫的那些。
反正我們通常做法是, delete后馬上把指向原來的那塊內(nèi)存的指針賦Null
作者: SirFang    時間: 2005-08-08 10:26
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: kernelxu    時間: 2005-08-08 12:11
標(biāo)題: delete何時開始生效。
原帖由 "BabyBlue" 發(fā)表:
delete成功后只是給那塊內(nèi)存做個可以回收的標(biāo)記,并不馬上清空。
你通過原來的指針還是可以看到里面的東東,就像你寫的那些。
反正我們通常做法是, delete后馬上把指向原來的那塊內(nèi)存的指針賦Null

同意!
你在delete后馬上再為其它指針申請空間,并賦上初值。然后再看看結(jié)果有沒有被"幸運(yùn)地"修改
作者: jinti    時間: 2005-08-08 23:00
標(biāo)題: delete何時開始生效。
如SirFang所說,釋放的是this指針,成員函數(shù)在編譯后會成為具體的函數(shù),并傳入this,如果在成員函數(shù)中操作這個this指針就會造成Invalid read。
作者: renstone921    時間: 2005-08-08 23:04
標(biāo)題: delete何時開始生效。
我在eat()函數(shù)里面加了一條value++;還是一樣的結(jié)果。
作者: lauxp    時間: 2005-08-13 14:35
標(biāo)題: delete何時開始生效。
從理論上說,delete應(yīng)該就是釋放了。

但這不是永遠(yuǎn)都正確,我估計樓主可能是在HP-UX上面的程序。
我以前初學(xué)的時候就是在HP-UX11上碰到過這種情況,我的一個同事也
跟我說過Compaq的芯片上好像都有這個問題。

關(guān)鍵的是,轉(zhuǎn)移到VC上就沒有問題,會報內(nèi)存錯誤。
所以不必?fù)?dān)心,因為你是對的。

在開發(fā)程序的時候,我們利用工具開發(fā),不能指望工具能夠完全控制。
所以呢,delete完了,null是明智的選擇,因為你不知道什么時候會
被收回去,這也許就是garbage collection的作用。

記住,你理論上沒有錯,繞過去才是你想要的結(jié)果。
理論跟實踐的差別就是這里,標(biāo)準(zhǔn)化就對了。




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2