【问题标题】:Delete pointer to multidimensional array in class through another pointer - how?通过另一个指针删除指向类中多维数组的指针 - 如何?
【发布时间】:2012-08-14 03:21:20
【问题描述】:

我有一个指向类的指针,它有一个指向多维数组的指针,但我似乎无法在需要时将其从内存中删除或将其设置为 NULL。

#define X 10
#define Y 10

struct TestClass
{
public:
       int      *pArray[X][Y];
};


// different tries, none working:

delete Pointer_To_TestClass->pArray[0][0];
delete[] Pointer_To_TestClass->pArray[0][0]

// or by simply:

Pointer_To_TestClass->pArray[0][0] = NULL;

我知道数组有数据,因为我可以在屏幕上看到结果。 还要检查它是否已经为NULL,然后不要尝试删除它。

既然我想删除另一个指针中的一个指针 - 这是一种不同的特殊情况吗?就像它删除了第一个指针,而不是指针内部的指针(pArray是第二个指针,Pointer_To_Testclass是第一个指针)

更新/解释

我希望能够删除 pArray[0][0] 而 pArray[0][1] 仍然存在,如果 [0][0] 不存在它应该等于 NULL强>。主要是因为我想通过 [X][Y] 值访问这个数组以便于访问。如果 [0][0] 是一个指针,那么在删除时它应该是 NULL,所以我可以检查它是否为 NULL。

有人有什么想法吗?

【问题讨论】:

  • 不过,这与它无关。它是一个多维指针数组,而不是指向多维数组的指针。
  • 有些事情告诉我你需要重新考虑你的代码。一定会有更好的方法。
  • 请考虑将std::vector 用于 C++ 中的数组。然后将指向锯齿状二维数组的指针声明为std::vector<std::vector<int> >*
  • 我会推荐关注the rule of zero。也就是说,“我如何删除这个东西?”的答案。取决于“我是如何分配这个东西的?”的答案,这个问题没有包含在问题中。
  • 我的问题仍然是,为什么我可以创建一个指针:Object *Object[X][Y] 并在其中存储数据(使用指针,通过 Object[X][Y] = new Object( ) 但不删除数据,因为它是一个指针。)

标签: c++ class pointers multidimensional-array delete-operator


【解决方案1】:

如果您想要一个指向<whatever> 的二维指针数组,请创建一个类来处理它,然后将它的一个实例放入您的TestClass。至于如何做到这一点,我通常会在这个订单上使用一些东西:

template <class T>
class matrix2d {
    std::vector<T> data;
    size_t cols;
    size_t rows;
public:
    matrix2d(size_t y, size_t x) : cols(x), rows(y), data(x*y) {}
    T &operator()(size_t y, size_t x) { 
        assert(x<=cols);
        assert(y<=rows);
        return data[y*cols+x];
    }
    T operator()(size_t y, size_t x) const { 
        assert(x<=cols);
        assert(y<=rows);
        return data[y*cols+x];
    }
};

class TestClass { 
    matrix2d<int *> array(10, 10);
public:
    // ...
};

但是,鉴于您正在存储指针,您可能需要考虑使用 Boost ptr_vector 而不是 std::vector

【讨论】:

  • 你在这里有点重新发明boost::multi_array
  • 坐标向后。增加第二个坐标应该是小跳跃,增加第一个坐标应该是大跳跃。事实上,for(i) for(j) 嵌套循环需要说 mat(j, i) 才能获得正确的内存遍历。
【解决方案2】:

如果您已经动态创建了一个数组,则使用 delete[] 将其删除。你必须给 delete[] 一个指向数组开头的指针,但是,不是数组的元素!

如果您希望元素可删除,则必须分别动态分配它们。

所以你必须有一个多维的指针数组;

int *(*pArray)[X][Y];

然后动态分配每个,这是的很痛苦。

有趣的是,您甚至尝试这样做,为什么要删除单个元素?

【讨论】:

  • 我有一个设定大小的网格,根据我的程序,它应该在每个 X 和 Y 坐标上渲染东西,但如果不是,它甚至不应该存储在内存中,因为它不需要.或者我可能想一次性删除一大块,还可以检查 Grid 中的哪些字段被占用,哪些没有。
  • 简单地说,一旦我完成了对象[X][Y],就不再需要它了。
  • 那么也许'object'类应该有一个停用模式?一种删除大部分准备再次激活的信息。
  • 你没有写我设置后如何删除对象。我希望元素不需要“存在”,当我完成它时,我只想删除该数组中的一个对象。我猜当我尝试这个时,指向包含指向该数组的指针的对象的指针被删除了。
  • 如果你按照我之前说的做了,那么使用 delete pArray[i][j];像以前一样删除。
【解决方案3】:

取决于您对pArray[i][j] 的分配。如果它类似于pArray[i][j] = new int;,请致电delete Pointer_To_TestClass-&gt;pArray[0][0];。如果它类似于pArray[i][j] = new int[10],则使用第二个选项delete[] Pointer_To_TestClass-&gt;pArray[0][0];。我还强烈建议在删除后立即将其设置为 NULL 并继续检查 NULL。

第三个没有为我编译delete[][] Pointer_To_TestClass-&gt;pArray[0][0];我得到了错误

第 34 行:错误:“[”标记之前的预期主表达式 编译因 -Wfatal-errors 而终止。

另外,我强烈建议在析构函数中包含这些删除。其他地方可能也可以。

您可能会发现 int* 的 typedef 有助于理解您有一个 int* 的二维数组。

【讨论】:

    【解决方案4】:
    #define X 10
    #define Y 10
    
    struct TestClass
    {
    public:
      TestClass()
      {
        // Must initialize pArray to point to real int's otherwise pArray
        // will have bogus pointers.
        for (size_t y = 0; y < Y; ++y)
          {
        for (size_t x = 0; x < X; ++x)
          {
            pArray[x][y] = new int;
          }
          }
      }
    
      int      *pArray[X][Y];
    };
    
    int main()
    {
      TestClass *Pointer_To_TestClass = new TestClass;
      delete Pointer_To_TestClass->pArray[0][0];
      Pointer_To_TestClass->pArray[0][0] = 0;
      return 0;
    }
    

    【讨论】:

    • 但我不想重置整个数组 (pArray) 我想重置数组 [x][y] 中的值,以便检查该值是否为 NULL。如果 NULL 将跳过,否则将对数据执行某些操作。如果我有一个普通数组,则该值不是 NULL。例如,我可能需要 pArray[0][0] 但不需要 pArray[0][1],因此 pArray[0][1] 应该是可删除的,而 pArray[0][0] 不会被删除。
    • ...对象 pArray 不是“整数”,而是对象(创建的类),所以我需要能够将其设置为 NULL。
    • ...我不能用这种方法。
    • @Deukalion 很抱歉,我假设您想要一个二维整数数组是不正确的。你在初始化 pArray 吗?起初,当它被创建时,它会有垃圾,它会在堆栈或堆上留下任何数据。如果它没有被初始化,你在尝试删除它时可能会出错。
    • 我更改了上面评论中的代码,以显示可以初始化 pArray 的一种方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多