访问指针数组/通过另一个指针并删除数组中的单个元素而不删除第一个指针或整个数组

Posted

技术标签:

【中文标题】访问指针数组/通过另一个指针并删除数组中的单个元素而不删除第一个指针或整个数组【英文标题】:Access pointer array / through another pointer and delete single element in array without deleting first pointer or whole array 【发布时间】:2012-08-18 21:15:13 【问题描述】:

在我的主窗口中,我创建了一个 PointerClass 的实例,它包含一个指向 PointerObject 的指针数组(我希望能够访问PointerObject[X][Y]以同样的方式删除它,并检查是否 PointerObject[X][Y] == NULL(这就是为什么我使用指针))并且我不想要带有向量的解决方案。

#define X 10
#define Y 10

class PointerObject

public:
        int X;
        int Y;


class PointerClass


public:
       PointerObject       *ArrayOfPointerObjects[X][Y];


PointerMethod(&PointerClass);

然后,在我的 PointerMethod 中创建指向数组的指针:

PointerMethod(PointerClass *pointerClass)

     // don't know the right way to do this
     pointerClass->ArrayOfPointerObjects= new PointerObject[X][Y];

     // set all pointers in the array to NULL - is this needed?
     for (int x=0; x < X; x++)
     
         for (int y=0; y < Y; y++)
         
              pointerClass->ArrayOfPointerObjects[x][y] = NULL;
         
     

     // trying to store some data here
     pointerClass->ArrayOfPointerObjects[0][0] = new PointerObject;

     // trying to delete it
     delete pointerClass->ArrayOfPointerObjects[0][0];
     // or trying this:
     delete[] pointerClass->ArrayOfPointerObjects[0][0];

     // causes access violation or doesn't work

我之前问过这个没有成功或关于错误类型的问题。

Delete pointer to multidimensional array in class through another pointer - how?

我可以访问数组,检查它是否为 NULL。但是当我调用 delete / delete[] pointerClass->ArrayOfPointerObjects[x][y] 时,它似乎删除了指向指针类的指针而不是 [X][Y] 处的元素,我想删除位置 [X] 处的指针[Y] 而不是指针类,我不想删除整个数组。

我怎样才能做到这一点又不会太复杂?我猜我的数组并不是真正的指针数组,只是指向数组的指针。但我希望它是存储在指针或其他东西中的指针数组。仍然重要的是我如何访问它以及如何删除数组中的元素。我需要能够检查指针是否为 NULL,如果无法删除该单个 PointerObject。

重要的是我想:

    使用 [X][Y] 访问 PointerObjects 数组 检查数组中的对象是否为 NULL(=需要指针) 删除指针数组中的单个项目,而不破坏指向 PointerClass 对象的指针或删除数组的其余部分。只需删除数组中某个 X、Y 位置的单个 PointerObject,使删除后的 [X][Y] = NULL。

如果与我的其他线程有太多的混淆或相似之处,那是因为人们告诉我我不希望的事情并且它导致了主题,这里更好地说明它是如何工作的以及我希望它如何工作。

【问题讨论】:

您的条件绝不需要“原始”指针。 请进一步解释。我不能只创建 PointerObjects 的多维数组并设置 PO[X][Y] = NULL,或删除 PO[X][Y] 或检查是否 (PO[X][Y] == NULL) 而不使用指针. unique_ptr 例如,完全满足您的要求;一般来说,我会把你指向他们和vectors,出于某种原因,你似乎反对这样的解决方案。 如果有要求阻止使用向量的解决方案,您需要解释原因。人们如何知道他们提出的任何其他解决方案是否满足您未公开的要求? 因为你如何循环遍历它,因为如果我删除一个对象,我每次都必须重置循环并且我经常要删除对象,所以我首先检查应该删除哪些坐标然后我删除它们而不是循环和循环和循环。 【参考方案1】:

嗯,我想像this

#include <iostream>

class Foo 

    int i_;
    int j_;
public:
    Foo(int i, int j) : i_(i), j_(j) 

    void print_coords()
    
        std::cout << this << " (" << i_ << ',' << j_ << ')' << std::endl;
    
;

class Bar

public:
    Foo *arr[5][5];  
;

class Que

public:
    void init(Bar *b)
    
        for(int i=0; i<5; i++)
            for(int j=0; j<5; j++)
                b->arr[i][j] = new Foo(i, j);
    

    void print(Bar *b, int i, int j)
    
        try 
            if(b->arr[i][j])
                b->arr[i][j]->print_coords();
            else
               throw 0;
         catch (int e) 
            std::cout << &b->arr[i][j] << " points to null" << std::endl;
        
    

    void rem(Bar *b, int i, int j)
    
        delete b->arr[i][j];
        b->arr[i][j] = 0;
    
;

int main()

    Bar *b = new Bar();
    Que *q = new Que();

    q->init(b);
    q->print(b, 2, 2);
    q->rem(b, 2, 2);
    q->print(b, 2, 2);

    return 0;

【讨论】:

以上是关于访问指针数组/通过另一个指针并删除数组中的单个元素而不删除第一个指针或整个数组的主要内容,如果未能解决你的问题,请参考以下文章

数组第一个,最后一个元素操作

指针和数组的关系

C语言-再论指针与数组

快慢指针--删除有序数组中的重复项

我可以使用 C++ 中的指针访问二维数组的元素吗?

防止数组删除元素时发生指针偏移