如何在C ++中删除动态分配指向int指针的指针?

时间:2015-11-27 19:53:29

标签: c++ pointers

我正在尝试删除指向动态分配的整数指针的指针,但是当我关闭程序时出现意外错误。

首先,在头文件中声明

class Client < ActiveRecord::Base
    #has_many :contracts
    #validates_cpf_or_cnpj :cpf_or_cnpj
    #validates_uniqueness_of :cpf_or_cnpj, message: "exists."
    #validates_uniqueness_of :rg, message: "exists."

以下分配......

class TileMapManager
{
public: 
     //Some public constructor, destructor and some functions...

private:
    // Other private data...
    int m_xSize;
    int m_ySize;
    int **m_mapSlots;

};

和释放功能。我在析构函数中调用它。

m_mapSlots = new int*[m_ySize];
    for (int i = 0; i < m_xSize; ++i)
        m_mapSlots[i] = new int[m_xSize];

我的程序已触发该行的断点。

我认为删除的方式没问题,但我不知道为什么会导致问题。 帮帮我。

3 个答案:

答案 0 :(得分:2)

当然可以

for (int i = 0; i < m_xSize; ++i)

不应该

for (int i = 0; i < m_ySize; ++i)

如果因{/ p>而发生m_xSize > m_ySize未定义的行为

  • m_mapSlots仅指向m_ySize指针
  • delete将尝试释放未分配的内存

答案 1 :(得分:1)

永远不要试图以这种方式模拟二维阵列。相反,定义一个整数的向量:

std::vector<int> m_mapSlots;
...
m_mapSlots.resize(m_ySize * m_xSize);

int v = m_MapSlots[x + y * x];

答案 2 :(得分:0)

您在分配中使用了错误的变量:

m_mapSlots = new int*[m_ySize];   //    allocates m_ySize elements
for (int i = 0; i < m_xSize; ++i) // goes through m_xSize elements
    m_mapSlots[i] = new int[m_xSize];

循环条件中的m_xSize应为m_ySize

或者,你知道,使用大小为std::vector<int>的{​​{1}}并避免整个混乱。