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

Chinaunix

標(biāo)題: 關(guān)于new和delete,幫忙測(cè)試一下下面的代碼。 [打印本頁]

作者: kiffa    時(shí)間: 2008-10-20 02:33
標(biāo)題: 關(guān)于new和delete,幫忙測(cè)試一下下面的代碼。
我手頭沒有win的編譯器,所以希望有vs、vc的能幫我測(cè)試一下下面的代碼,看看輸出結(jié)果是什么。用gcc的也順便測(cè)試一下,我看看各個(gè)版本是否有差別。

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


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



我這里的測(cè)試結(jié)果是輸出 5 個(gè) "haha"。
作者: blizzard213    時(shí)間: 2008-10-20 02:52
原帖由 kiffa 于 2008-10-20 02:33 發(fā)表
我手頭沒有win的編譯器,所以希望有vs、vc的能幫我測(cè)試一下下面的代碼,看看輸出結(jié)果是什么。用gcc的也順便測(cè)試一下,我看看各個(gè)版本是否有差別。

class A
{
    public:
             int i;
          ...

vc2005
5個(gè) haha

可以解釋一下嗎?
感覺是p前一個(gè)int為記錄數(shù)組大小的cookie。。。

[ 本帖最后由 blizzard213 于 2008-10-20 02:56 編輯 ]
作者: cj_gameboy    時(shí)間: 2008-10-20 08:19
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
作者: voodoo_cat    時(shí)間: 2008-10-20 08:21
vs2008也是5個(gè)haha。

ls說法應(yīng)該是正確的。
作者: disheng727    時(shí)間: 2008-10-20 09:21
厲害,原來P-1的存儲(chǔ)位置為該動(dòng)態(tài)存儲(chǔ)元素的個(gè)數(shù)。將其改成5,就調(diào)用了5次析構(gòu),如果改成7,也就將調(diào)用7次析構(gòu)。
作者: alexhappy    時(shí)間: 2008-10-20 09:28
原帖由 disheng727 于 2008-10-20 09:21 發(fā)表
厲害,原來P-1的存儲(chǔ)位置為該動(dòng)態(tài)存儲(chǔ)元素的個(gè)數(shù)。將其改成5,就調(diào)用了5次析構(gòu),如果改成7,也就將調(diào)用7次析構(gòu)。

真有此事?我去測(cè)試一下。。。。
作者: 紫色的撒加    時(shí)間: 2008-10-20 10:33
所有編譯器都這樣嗎?
作者: mik    時(shí)間: 2008-10-20 11:14
用 A*p = new A[3];  來建個(gè)A object 數(shù)組的模型的這樣的:

                ----------
                        |          |      A[2]
                        ----------
                        |          |       A[1]
                        ----------
                        |          |       A[0]
                        ----------       <--------- p
                        |    3    |      size ( new 返回)
                        ----------      


int *ip = (int*)(p - 1); 將 size 改成 5
作者: disheng727    時(shí)間: 2008-10-20 11:28
int *ip = (int*)(p - 1);

好像有點(diǎn)不對(duì)吧,這種情況下只有當(dāng)該類對(duì)象的大小剛好為一個(gè)指針的大小才成立,如若把A的成員int i改為char ch,就有點(diǎn)問題,覺得應(yīng)該是:int *ip = (int*)(p) - 1;
作者: blizzard213    時(shí)間: 2008-10-20 11:29
原帖由 mik 于 2008-10-20 11:14 發(fā)表
用 A*p = new A[3];  來建個(gè)A object 數(shù)組的模型的這樣的:

                ----------
                        |          |      A[2]
                        ----------
                         ...

請(qǐng)問下 這個(gè)應(yīng)該只是一種通用的實(shí)現(xiàn)方式吧 標(biāo)準(zhǔn)不太可能規(guī)定這個(gè)
作者: blizzard213    時(shí)間: 2008-10-20 11:30
原帖由 disheng727 于 2008-10-20 11:28 發(fā)表

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

拜托 p只是指針。。。 其sizeof在一個(gè)特定平臺(tái)上是一個(gè)特定值
怎么和對(duì)象大小扯上關(guān)系了。。
作者: mik    時(shí)間: 2008-10-20 11:34
原帖由 blizzard213 于 2008-10-20 11:29 發(fā)表

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


不知道,沒看過C++標(biāo)準(zhǔn),偶只是在VS2008下觀察得來的,gcc也是一樣
作者: disheng727    時(shí)間: 2008-10-20 11:38
拜托 p只是指針。。。 其sizeof在一個(gè)特定平臺(tái)上是一個(gè)特定值
怎么和對(duì)象大小扯上關(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é)果如何。
作者: blizzard213    時(shí)間: 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;

我又嘗試 ...

高度中沒報(bào)什么錯(cuò)?
什么意思
作者: ztz0223    時(shí)間: 2008-10-20 15:34
在《inside c++ object model》里面就說到過這個(gè)東西
不同的編譯器的實(shí)現(xiàn)會(huì)不同
但是現(xiàn)在貌似統(tǒng)一的挺不錯(cuò)了,一般的會(huì)在一個(gè)new或者malloc分配的空間的前面和后面放一段空間的cookies
前面是分配的個(gè)數(shù)符號(hào)
后面是分配的終止符號(hào)
符號(hào)會(huì)因?yàn)椴煌念惖姆峙涠煌?hr noshade size="2" width="100%" color="#808080"> 作者: kiffa    時(shí)間: 2008-10-20 18:07
一個(gè)復(fù)雜一點(diǎn)的例子:

// A定義和第一個(gè)帖子定義一樣

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


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

然后:

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

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

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

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

而delete []A時(shí),把p - 1中的值作為分配對(duì)象的個(gè)數(shù)來調(diào)用析構(gòu)函數(shù),然后把p - 2的值作為內(nèi)存大小釋放,而這里的p - 2 其值為0,所以delete語句并沒有釋放內(nèi)存。
作者: Godbach    時(shí)間: 2008-10-20 18:15
原帖由 cj_gameboy 于 2008-10-20 08:19 發(fā)表
我是新手,請(qǐng)教下,C++可以在unix上編譯嗎,原以為C++只能在win平臺(tái)上編譯,用vs編譯,是不是我搞錯(cuò)了,也可以用gcc編譯啊


C/C++都可以在LINUX和WINDOWS編譯和運(yùn)行的。
作者: kiffa    時(shí)間: 2008-10-20 18:15
同樣:

new A[3];
delete A;

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


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

[ 本帖最后由 kiffa 于 2008-10-20 18:18 編輯 ]




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