2011-10-20 31 views
0

我想知道是什麼模板,使用下面的兩個指針之間的區別:內存分配的指針和一個複製指針在模板

讓我們假設我分配的內存如下所示:

int* myPtr = new int[10]; 
int* anotherPtr = myPtr; 

現在,我通過「myPtr」和「anotherPtr」一些功能:

doSomthing(myPtr, status); 
doAnotherThing(anotherPtr, status); 

上述兩個函數中,我使用這個參數來定義模板類,蘇ch爲:

tResource<int>* m_resourcePtr1; 
tResource<int>* m_resourcePtr2; 
m_resourcePtr1 = new tResource<int> (anotherPtr); 
m_resourcePtr2 = new tResource<int> (myPtr); 

resourcePtr1和resourcePtr2之間是否有區別?

+0

不存在。 –

+0

@Bassam你的問題背後似乎有某種原因。如果你會解釋你爲什麼問這個問題,那麼給出一個對你有意義的答案會更容易。 – selalerer

回答

2

也許吧。這取決於tResource對指針的作用。 tResource的構造函數可能會忽略指針參數並始終表現相同。因爲你沒有給什麼tResource是或做任何細節,我們不能比說m_resourcePtr1 != m_resourcePtr2

+1

-1'anotherPtr == myPtr',所以沒有區別。 –

+0

+1:迄今爲止唯一嚴格正確的答案(儘管當OP澄清他的問題時,其他人可能會最終正確) –

+0

@Paul:你甚至讀過這個答案嗎?當你不知道'tResource'是什麼時,你怎麼知道'(anotherPtr == myPtr)=>(m_resourcePtr1 == m_resourcePtr2)'? –

0

是否有resourcePtr1和resourcePtr2之間有什麼不同任何更具體。只有當你構建在構造對象時使用一些static狀態

這兩個對象不會是等價的,並更新其每次被創建的對象,或者你使用一些全局狀態,或其他任何方式狀態,這並不取決於構造函數的參數,如rand()或用戶輸入。

否則,兩個對象都是等價的,因爲兩者都是從完全相同的信息myPtr構建的。

另外,anotherPtr指向與myPtr相同的對象,因此它們是相同的。如果你delete myPtranotherPtr將會失效。

因此,下面

m_resourcePtr1 = new tResource<int> (anotherPtr); 
m_resourcePtr2 = new tResource<int> (myPtr); 

等效於此,

m_resourcePtr1 = new tResource<int> (myPtr); 
m_resourcePtr2 = new tResource<int> (myPtr); 

現在問自己,是否有m_resourcePtr1m_resourcePtr2之間有什麼區別?答案非常簡單。

+0

除非你知道'tResource'是什麼,否則你不能保證。 –

+0

答案仍然是「誰知道」? 'tResource'裏面有一個自動遞增計數器會怎麼樣?這兩個對象是立即不同的,這只是一個微不足道的例子! –

+0

@ TomalakGeret'kal:我添加了幾個文本。 – Nawaz

0

沒有區別;構造函數無法區分兩個int指針—實際上,它們之間沒有區別,因爲它們都指向相同的數組。一個指針是您在第一次創建數組時使用的指針並不會與其他指針有任何區別。

但是,請注意,您的代碼是錯誤的:如果您要執行的操作是將指針傳遞給數組,則還應該傳遞數組的大小(本例中爲10)。你還會知道該數組包含多少個整數?

+0

該類可能有其他狀態,_not_不直接從ctor參數中獲取,這使得兩個對象不同。你只是不太瞭解班級做出這些保證。 –

+0

@Tomalak它很清楚OP是詢問指針之間是否有區別;假設'tResource'中沒有任何興趣是合理的。 –

+1

你知道什麼是假設,不是嗎? –