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

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12
最近訪問板塊 發(fā)新帖
樓主: kiffa
打印 上一主題 下一主題

[C++] 關(guān)于new和delete,幫忙測試一下下面的代碼。 [復(fù)制鏈接]

論壇徽章:
0
11 [報告]
發(fā)表于 2008-10-20 11:30 |只看該作者
原帖由 disheng727 于 2008-10-20 11:28 發(fā)表

好像有點(diǎn)不對吧,這種情況下只有當(dāng)該類對象的大小剛好為一個指針的大小才成立,如若把A的成員int i改為char ch,就有點(diǎn)問題,覺得應(yīng)該是:int *ip = (int*)(p) - 1;

拜托 p只是指針。。。 其sizeof在一個特定平臺上是一個特定值
怎么和對象大小扯上關(guān)系了。。

論壇徽章:
0
12 [報告]
發(fā)表于 2008-10-20 11:34 |只看該作者
原帖由 blizzard213 于 2008-10-20 11:29 發(fā)表

請問下 這個應(yīng)該只是一種通用的實(shí)現(xiàn)方式吧 標(biāo)準(zhǔn)不太可能規(guī)定這個


不知道,沒看過C++標(biāo)準(zhǔn),偶只是在VS2008下觀察得來的,gcc也是一樣

論壇徽章:
0
13 [報告]
發(fā)表于 2008-10-20 11:38 |只看該作者
拜托 p只是指針。。。 其sizeof在一個特定平臺上是一個特定值
怎么和對象大小扯上關(guān)系了。。

class A
{
    public:
             //int i;
             char ch;
             ~A(){cout << "haha" << endl;}
};


int main()
{
    A *p = new A[3];
   
    int *ip = (int*)(p - 1);
    *ip = 5;
   
    delete []p;
}

   
自己去試一下就知道輸出結(jié)果如何。

論壇徽章:
0
14 [報告]
發(fā)表于 2008-10-20 11:50 |只看該作者
原帖由 j1111011 于 2008-10-20 11:44 發(fā)表
A *p = new A[3];
   
    int *ip = (int*)(p - 1);
    *ip = 8;
   p[6] = 12;
   A bobo        =        p[3];
   bobo        =        p[4];
   bobo = p[5];
   bobo        =        p[6];
   bobo        =        p[7];
    delete []p;

我又嘗試 ...

高度中沒報什么錯?
什么意思

論壇徽章:
0
15 [報告]
發(fā)表于 2008-10-20 15:34 |只看該作者
在《inside c++ object model》里面就說到過這個東西
不同的編譯器的實(shí)現(xiàn)會不同
但是現(xiàn)在貌似統(tǒng)一的挺不錯了,一般的會在一個new或者malloc分配的空間的前面和后面放一段空間的cookies
前面是分配的個數(shù)符號
后面是分配的終止符號
符號會因?yàn)椴煌念惖姆峙涠煌?/td>

論壇徽章:
0
16 [報告]
發(fā)表于 2008-10-20 18:07 |只看該作者
一個復(fù)雜一點(diǎn)的例子:

// A定義和第一個帖子定義一樣

A *p = new A;
cout << (long)p << endl;
delete p;
A *p2 = new A;
cout << (long)p2 << endl;


你會發(fā)現(xiàn)p 和 p2 的值是一樣的。

然后:

A *p = new A;
cout << (long)p << endl;
delete []p;  // 注意。

A *p2 = new A;
cout << (long)p2 << endl;

你會發(fā)現(xiàn)p 和 p2不同,其根本原因就是delete []p 這一句并沒有釋放內(nèi)存。

new A的時候,p - 1中存放內(nèi)存大小相關(guān)的數(shù)據(jù),p - 2中為0,delete A 時訪問p - 1得到內(nèi)存大小,釋放。

而delete []A時,把p - 1中的值作為分配對象的個數(shù)來調(diào)用析構(gòu)函數(shù),然后把p - 2的值作為內(nèi)存大小釋放,而這里的p - 2 其值為0,所以delete語句并沒有釋放內(nèi)存。

論壇徽章:
36
IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-10 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-16 06:20:0015-16賽季CBA聯(lián)賽之廣東
日期:2016-04-16 19:59:32IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-18 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-19 06:20:00每日論壇發(fā)貼之星
日期:2016-04-19 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-04-25 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-06 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-08 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-13 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-28 06:20:00每日論壇發(fā)貼之星
日期:2016-05-28 06:20:00
17 [報告]
發(fā)表于 2008-10-20 18:15 |只看該作者
原帖由 cj_gameboy 于 2008-10-20 08:19 發(fā)表
我是新手,請教下,C++可以在unix上編譯嗎,原以為C++只能在win平臺上編譯,用vs編譯,是不是我搞錯了,也可以用gcc編譯啊


C/C++都可以在LINUX和WINDOWS編譯和運(yùn)行的。

論壇徽章:
0
18 [報告]
發(fā)表于 2008-10-20 18:15 |只看該作者
同樣:

new A[3];
delete A;

會把分配對象的個數(shù)當(dāng)成內(nèi)存大小的相關(guān)信息來釋放,只要A不小于一個字節(jié),那么就會導(dǎo)致內(nèi)存釋放不完全,造成泄露。


因此這不僅僅是析構(gòu)函數(shù)調(diào)用次數(shù)不夠的問題,還可能造成內(nèi)存泄露,不過限定于編譯器的特定實(shí)現(xiàn)。

[ 本帖最后由 kiffa 于 2008-10-20 18:18 編輯 ]
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(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