C ++指针麻烦

时间:2010-09-14 01:40:58

标签: c++ pointers

所以我有这个指针数组

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指针直接指定给数据,而不是指向另一个指针?我做得对吗还是有更好的方法来做我正在做的事情吗?

4 个答案:

答案 0 :(得分:3)

您一定要查看STL(标准模板库)容器。这里有一个很好的资源:http://www.cplusplus.com/reference/stl/

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

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

这就是问题的c ++方法,让STL为你解决容器分配问题。

答案 1 :(得分:2)

你需要一个新的数组来保存指针。

image* [] myArray = new image* [...number of image* elements needed..];

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

请参阅有关数组大小调整的文章:http://www.fredosaurus.com/notes-cpp/newdelete/55dynexample.html

答案 2 :(得分:1)

  

其中,我认为删除对象   从数组,以及指针   对那些对象。

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

指针和c风格的数组可能是一个棘手的主题,我认为图表是找出正在发生的事情的最好方法之一。你有myArray,它实际上是一个Image **

                     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时,它们都指向同一个指针数组。这很好,只要你只删除其中一个。

答案 3 :(得分:0)

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

myArray被赋予与newArray相同的值,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]));
}