Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

這樣做以後就不能delete指標?

0 views
Skip to first unread message

㊣小臃腫㊣

unread,
Aug 18, 2001, 12:22:42 PM8/18/01
to
我想要把陣列裡面的元素通通往左移一格
但是又不想用for迴圈一個一個移(有點慢)
所以就把腦筋動到指標上:
int *arr=new int [m];
arr++; //元素左移

delete []arr; //這行指令編譯會過
//但執行會有錯誤訊息

雖然說不delete跑起來好像也沒事
但是心裡還是毛毛的 而且書上也沒有
相關的說明 請大家幫我解惑吧

ps我是用vc6編譯的

--
[m [1;35m※ 來源:‧蛋捲廣場 bbs.tku.edu.tw‧[FROM: 61.224.9.46] [m

小豆豆

unread,
Aug 18, 2001, 1:23:34 PM8/18/01
to
※ 引述《bobhsi...@bbs.tku.edu.tw (㊣小臃腫㊣)》之銘言:

> 我想要把陣列裡面的元素通通往左移一格
> 但是又不想用for迴圈一個一個移(有點慢)
> 所以就把腦筋動到指標上:
> int *arr=new int [m];
> arr++; //元素左移
> delete []arr; //這行指令編譯會過
> //但執行會有錯誤訊息
> 雖然說不delete跑起來好像也沒事
> 但是心裡還是毛毛的 而且書上也沒有
> 相關的說明 請大家幫我解惑吧
> ps我是用vc6編譯的
當你new一塊記憶體位置時,編譯器會在傳回的指標前的記憶體加上一些資訊
所以,你delete不是用new傳回的指標,就會發生錯誤
應該要這樣做
int* temp=new int[m];
int* arr=temp;
arr++;
delete temp;
--
[1;32m┌───── [33m◆ [37mKKCITY [33m◆ [32m─────┐ [34m┐┌┐┐┌┐┌─┐┌┬┐┌┬┐┐ ┌ [m
[1;32m│ [31m bbs.kkcity.com.tw [32m│ [37m├┘┐├┘┐│ │ │ └┬┘ [m
[1;32m└── [34m《 [0;37mFrom:61.224.192.146 [1;34m》 [32m──┘ [36m┘ ┘┘ ┘└─┘└┴┘ ┴ ┴ [m

烏拉諾斯

unread,
Aug 18, 2001, 1:03:29 PM8/18/01
to
※ 引述《bobhsi...@bbs.tku.edu.tw (㊣小臃腫㊣)》之銘言:
> 我想要把陣列裡面的元素通通往左移一格
> 但是又不想用for迴圈一個一個移(有點慢)
> 所以就把腦筋動到指標上:
> int *arr=new int [m];
> arr++; //元素左移
> delete []arr; //這行指令編譯會過
> //但執行會有錯誤訊息
可是這樣不是怪怪的ㄇ 你把記憶體位址加一了
這樣就算殺也會殺錯ㄚ???
--
[m※ Origin: 雲林科技大學藍天使 <bbs.yuntech.edu.tw> [From: 140.125.32.51]

John Lin

unread,
Aug 18, 2001, 10:01:51 PM8/18/01
to
"烏拉諾斯" 撰寫
> ※ 引述《(㊣小臃腫㊣)》之銘言:

> > 我想要把陣列裡面的元素通通往左移一格
> > 但是又不想用for迴圈一個一個移(有點慢)
> > 所以就把腦筋動到指標上:
> > int *arr=new int [m];
> > arr++; file://元素左移
> > delete []arr; file://這行指令編譯會過
> > file://但執行會有錯誤訊息
> 可是這樣不是怪怪的ㄇ 你把記憶體位址加一了
> 這樣就算殺也會殺錯ㄚ???

剛好你們討論的問題就是 C/C++ 的致命傷,指標亂指、錯誤或忘記的 delete
所以後來的語言如 Java、Perl... 等設計就只有 reference 沒有指標

通通往左移一格,您可以考慮這樣做:

原來是

int *arr=new int [m];
arr++; //元素左移

num = arr[3]; // 取裡面的內容
delete []arr; //這行指令編譯會過

改成

int *arr = new int [m];
int *relative_arr = arr + 1;
num = relative_arr[3]; // 取相對位置,就好像元素都左移過一格了
delete []arr; // *arr 根本沒被動過,所以就不會有 memory leak

John Lin


美麗的錯誤

unread,
Aug 19, 2001, 3:58:20 AM8/19/01
to
《 在 johnlin. 的大作中提到: 》
: "烏拉諾斯" 撰寫

嗯~~
不錯用喔
學到一招摟.....:)
可是要取原來的第一個要怎麼取呀
--
[m [1;34m※ 來源:‧蛋捲廣場 bbs.tku.edu.tw‧[FROM: 140.111.81.150] [m

烏拉諾斯

unread,
Aug 19, 2001, 4:25:03 AM8/19/01
to
※ 引述《superm...@bbs.tku.edu.tw (美麗的錯誤)》之銘言:
> 《 在 johnlin. 的大作中提到: 》

> 嗯~~
> 不錯用喔
> 學到一招摟.....:)
> 可是要取原來的第一個要怎麼取呀
將位址再減一就好啦..

lukewarm

unread,
Aug 20, 2001, 10:41:27 AM8/20/01
to
==> 在 Apya...@bbs.yuntech.edu.tw (烏拉諾斯) 的文章中提到:

> ※ 引述《superm...@bbs.tku.edu.tw (美麗的錯誤)》之銘言:
> > 《 在 johnlin. 的大作中提到: 》
> > 嗯~~
> > 不錯用喔
> > 學到一招摟.....:)
> > 可是要取原來的第一個要怎麼取呀
> 將位址再減一就好啦..

arr[0]不就是了?
位址減一?

--
* Origin: ★ 交通大學資訊科學系 BBS ★ <bbs.cis.nctu.edu.tw: 140.113.23.3>

烏拉諾斯

unread,
Aug 20, 2001, 11:10:42 AM8/20/01
to
※ 引述《perso...@bbs.cis.nctu.edu.tw (lukewarm)》之銘言:

> ==> 在 Apya...@bbs.yuntech.edu.tw (烏拉諾斯) 的文章中提到:
> > 將位址再減一就好啦..
> arr[0]不就是了?
ㄟ 不是吧 它位址一開始加一了
> 位址減一? 後來 當然address要減一囉...

美麗的錯誤

unread,
Aug 21, 2001, 1:48:10 AM8/21/01
to
《 在 Apya...@bbs.yuntech.edu.tw (烏拉諾斯) 的大作中提到: 》
: ※ 引述《perso...@bbs.cis.nctu.edu.tw (lukewarm)》之銘言:

: > ==> 在 Apya...@bbs.yuntech.edu.tw (烏拉諾斯) 的文章中提到:
: > > 將位址再減一就好啦..
: > arr[0]不就是了?
: ㄟ 不是吧 它位址一開始加一了
: > 位址減一? 後來 當然address要減一囉...

如果用參考來做的話
那記憶體的位置不就被delete後
有可能會被其他使用而改變嗎?
我覺得不是很保險耶
我的想法有沒有錯呢..
並且指到矩陣以外的地方不是不太好嗎..@_@"

--
[m [1;32m※ 來源:‧蛋捲廣場 bbs.tku.edu.tw‧[FROM: 140.111.81.150] [m

0 new messages