→ UNARYvvv:剛好沒事罷了 61.70.137.117 07/28
> -------------------------------------------------------------------------- <
作者: StubbornLin (Victor) 看板: C_and_CPP
標題: Re: [問題] 關於指標轉換的問題....
時間: Thu Jul 28 01:12:12 2005
※ 引述《polor (...)》之銘言:
: int main(int argc, char* argv[])
: {
: int *a = new int;
: char *b , *c;
: b = (char*)a;
: c = b + 1;
: delete b;
: *c = 'a';
: *b = 'a';
: printf("Hello World!\n%c\n",*b);
: return 0;
: }
: b的記憶體已經被釋放了....
: 程式到 *b = 'a'; 這一行應該會當掉才對...
: 但是卻沒事??請問是什麼原因嗎??
雖然 記憶體已經被釋放了
但是指標依然指著那個位置
所謂的釋放 只是在作業係統裡面的記憶體管理
標示記憶體可以使用 然而 當有其它的記憶體被申請
b就可能被拿去使用
但是...作業係統不可能每次存取時都去檢查記憶體是否可以使用
因為這樣太浪費時間了 所以 只檢查不合法的存取
一般會當掉的情況 是去存取不合法的記憶體位置
例如0x00000之類的 或是堆疊暴了 還有....啥我忘了= =
上面是推論..不過應該差不了多少 XD
--
VICTOR工作室
URL : http://www.kinmen.info/vic/
C/C++
Visual Basic 6.0
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.116.66.235
> -------------------------------------------------------------------------- <
作者: mashimaro96 (= =+++) 看板: C_and_CPP
標題: Re: [問題] 關於指標轉換的問題....
時間: Thu Jul 28 09:03:41 2005
※ 引述《StubbornLin (Victor)》之銘言:
: ※ 引述《polor (...)》之銘言:
: : int main(int argc, char* argv[])
: : {
: : int *a = new int;
: : char *b , *c;
: : b = (char*)a;
: : c = b + 1;
: : delete b;
: : *c = 'a';
: : *b = 'a';
: : printf("Hello World!\n%c\n",*b);
: : return 0;
: : }
: : b的記憶體已經被釋放了....
: : 程式到 *b = 'a'; 這一行應該會當掉才對...
: : 但是卻沒事??請問是什麼原因嗎??
: 雖然 記憶體已經被釋放了
: 但是指標依然指著那個位置
被釋放的指標會指向NULL // Wrong
被釋放的指標記得要指向NULL
: 所謂的釋放 只是在作業係統裡面的記憶體管理
: 標示記憶體可以使用 然而 當有其它的記憶體被申請
: b就可能被拿去使用
跟b沒有關係...b 是 pointer ...與記憶體是不同的
pointer 是用來指向記憶體的位置...
所以正確說法是b可以指到別的位置
: 但是...作業係統不可能每次存取時都去檢查記憶體是否可以使用
: 因為這樣太浪費時間了 所以 只檢查不合法的存取
基本上OS的記憶體管理會把釋放的位置用個table存起來
使得零碎的記憶體可以快速重複利用
這部份是OS處理...programmer不需要管到這裡
: 一般會當掉的情況 是去存取不合法的記憶體位置
: 例如0x00000之類的 或是堆疊暴了 還有....啥我忘了= =
: 上面是推論..不過應該差不了多少 XD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.69.13.1
※ 編輯: mashimaro96 來自: 210.69.13.1 (07/28 09:04)
推 UNARYvvv:你所謂"釋放"是 delete 嗎? 如果是那怎麼會指向 61.70.137.117 07/28
推 UNARYvvv:NULL 呢?? 61.70.137.117 07/28
→ UNARYvvv:假如 programmer 沒把它設成 NULL,誤用的機會 61.70.137.117 07/28
→ UNARYvvv:往往就會很大 61.70.137.117 07/28
※ 編輯: mashimaro96 來自: 210.69.13.1 (07/28 14:14)
推 mashimaro96:我寫錯了...已更正...抱歉"" 210.69.13.1 07/28
> -------------------------------------------------------------------------- <
作者: khoguan (Khoguan Phuann) 看板: C_and_CPP
標題: Re: [問題] 關於指標轉換的問題....
時間: Thu Jul 28 15:37:11 2005
※ 引述《polor (...)》之銘言:
: int main(int argc, char* argv[])
: {
: int *a = new int;
: char *b , *c;
:
: b = (char*)a;
: c = b + 1;
:
: delete b;
:
: *c = 'a';
: *b = 'a';
:
: printf("Hello World!\n%c\n",*b);
: return 0;
: }
: b的記憶體已經被釋放了....
: 程式到 *b = 'a'; 這一行應該會當掉才對...
: 但是卻沒事??請問是什麼原因嗎??
: --
: → UNARYvvv:剛好沒事罷了 61.70.137.117 07/28
就像 UNARY大大所說的,只是剛好沒事而已。
原po的寫法另外還有一個嚴重的問題:硬將 int* 的 a 轉成 char* 然後
assign 給 b, 接著透過 b 去 delete 一個原本是 int 的物件。
依據 C++標準[註],這種 做法的下場是 undefined behavior, 凡是
undefined behavior 的行為都要絕對避免。
[註] 5.3.5/p3
In the first alternative (delete object), if the static type of
the operand is different from its dynamic type, the static type
shall be a base class of the operand's dynamic type and the static
type shall have a virtual destructor or the behavior is undefined.
In the second alternative (delete array) if the dynamic type of the
object to be deleted differs from its static type, the behavior is
undefined.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.130.208.168
※ 編輯: khoguan 來自: 220.130.208.168 (07/28 15:57)
推 UNARYvvv:其實我就是在等k大拿規格來解釋啊 XD 61.70.137.117 07/28
→ UNARYvvv:先前覺得那種寫法怪怪卻沒資料不敢多猜測.. 61.70.137.117 07/28
推 StubbornLin:我一向是沒資料就亂猜的 XD 59.116.66.235 07/28