内存分配指针和模板中的复制指针

时间:2011-10-20 15:59:16

标签: c++

我想知道在模板中使用以下两个指针有什么区别:

让我们假设我分配了一个内存如下:

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

现在,我将“myPtr”和“anotherPtr”传递给某些函数:

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

在上面两个函数中我使用此参数来定义模板类,例如:

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

resourcePtr1和resourcePtr2之间有什么区别吗?

3 个答案:

答案 0 :(得分:2)

也许。这取决于tResource对指针的作用。可能是tResource的构造函数只是忽略指针参数并且总是表现相同。既然你没有详细说明tResource是什么或做了什么,我们就不能再说m_resourcePtr1 != m_resourcePtr2

了。

答案 1 :(得分: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之间有什么区别吗?答案非常简单。

答案 2 :(得分:0)

没有区别;构造函数无法区分两个int-pointers - 事实上,它们之间没有区别,因为它们都指向同一个数组。一个指针是您在第一次创建数组时使用的指针,这一事实并没有使它与其他指针有任何不同。

但是,请注意您的代码是错误的:如果您要做的是将指针传递给数组,您还应该传递数组的大小(在这种情况下为10) 。你怎么知道数组包含多少个int?