2010-09-14 84 views
1

所以我有这个数组指针C++指针故障

image* [] myArray; 

和我的数组中复制的对象到一个新的,更大的阵列。

for (int i=0; i<maxObjects; i++){ 
    newArray[i] = myImages[i]; 
} 
for (int i=maxObjects; i<newMaxObjects; i++){ 
    newArray[i] = NULL; 
} 

这点的重点是调整我的数组。然后我删除myArray:

delete [] myArray; 

其中,我假设删除数组中的对象,以及指向这些对象的指针。现在我想再次声明myArray

image* [] myArray; 

并将其设置为指向我的新的更大的阵列。

myArray = newArray; 

这是我迷路的地方:现在我有两个指向同一个数组的指针。 myArray指向与newArray相同的东西,对吧?或者,我错了,myArray现在指向newArray(指针),它指向我想要的对象?

我的主要问题:如何删除临时指针myArray而不删除它指向的数据?另外,如何将myArray指针直接分配给数据,而不是指向另一个指针?我做对了还是有更好的方式去做我正在做的事情?

+3

'删除[] myArray的;'不删除指针 – Anycorn 2010-09-14 01:46:11

+1

做得到[书](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list )并使用'std :: vector'。 – GManNickG 2010-09-14 02:33:10

回答

0
  • 这是我迷路的地方:现在我已经有 有两个指向同一个数组的指针。 myArray指向与 newArray相同的东西,对不对?或者,我错了,并且 myArray现在指向newArray( 指针),它指向我想要的对象 ?

myArray被赋予与newArray相同的值,它是newArray的第一个元素的内存位置。在你说myArray = newArray;之后,如果你将newArray赋值为NULL,myArray仍然会指向数据访问者。

  • 我的主要问题:如何删除 临时指针myArray而不删除它指向的数据?

myArray = NULL;只会重置指针。 delete [] myArray;将释放为指向数据的指针保存的内存,但不会删除实际数据。

  • 此外,我怎么直接分配myArray的 指针数据, 而不是指向另一个 指针?我这样做是正确的或者是 有更好的方法做什么我做 -

使用间接运算符(*)上检索它指向数据的指针。 newerArray将包含指向数据的指针数组。 newestArray是数据的数组。

image* newerArray = new (image*)[size]; 
for (int i = 0; i < size; i++) 
{ 
    newerArray[i] = *(myArray[i]); 
} 



image newestArray = new image[size]; 
for (int i = 0; i < size; i++) 
{ 
    newestArray[i] = *(*(myArray[i])); 
} 
+0

嘿谢谢 - 因此,当我做 myImages = newArray; 我需要将newArray设置为null,还是不重要?不会有内存泄漏,因为它只是一个指针,对吧? – user446912 2010-09-14 02:53:21

3

你一定要看看STL(标准模板库)的容器。一个很好的资源位于:http://www.cplusplus.com/reference/stl/

例如,您可以使用矢量类来存储图像实例。只要需要更多空间,它就会自动增长。 它会是这样的:

vector<image> imageVector; 
imageVector.push_back(aImageInstance1); 
imageVector.push_back(aImageInstance2); 

这几乎是对这个问题的C++的办法,让STL工作了容器分配给你的。

1

其中,我相信删除从阵列的对象 ,以及指针 对这些对象。

不正确;这只会删除分配给指针数组的空间,而不是它们指向的对象。但是,由于您已将这些移动到一个新的更大的阵列,因此这不是问题。

指针和c风格的数组可能是一个棘手的问题,我认为图是确定发生了什么的最佳方法之一。你有myArray的,这实在是一个图片**

     myArray's array  The objects pointed to by the array. 
myArray (Image**) -> myArray[0] (Image*) -> *(myArray[0]) (Image) 
        -> myArray[1] (Image*) -> *(myArray[1]) (Image) 
        -> myArray[2] (Image*) -> *(myArray[0]) (Image) 

然后,您创建的指针,其指向同一个对象的新数组:

     myArray's array  The objects    newArray's array 
myArray (Image**) -> myArray[0] (Image*) -> *(myArray[0]) (Image) <- newArray[0] (Image*) <- newArray (Image**) 
        -> myArray[1] (Image*) -> *(myArray[1]) (Image) <- newArray[1] (Image*) 
        -> myArray[2] (Image*) -> *(myArray[0]) (Image) <- newArray[2] (Image*) 
              NULL     <- newArray[3] 

当你删除myArray的,只删除阵列指针,留下newArray指向底层元素:

The objects    newArray's array 
    *(myArray[0]) (Image) <- newArray[0] (Image*) <- newArray (Image**) 
    *(myArray[1]) (Image) <- newArray[1] (Image*) 
    *(myArray[0]) (Image) <- newArray[2] (Image*) 
    NULL     <- newArray[3] 

当执行最终myArray的= newArray,它们都指向指针的相同阵列。这很好,只要你只删除其中一个。