C++ - 删除二维数组

标签 c++ visual-c++

我在 VC++ 中工作,但这是一个基本的 C++ 问题......我对 C++ 很陌生,从来不用担心在 Java 中删除......无论如何,经过一些研究,我相信我已经找到了删除的正确方法,但不起作用...我在函数中使用了一些临时二维数组,在结束函数之前,我需要删除它们。这是代码:

int** a;
a = new int*[b/2];
for(int i = 0; i < (b/2); i++)
{
    a[i] = new int[b];

}

    // some code here. Not changing the b variable!

for(int i = 0; i < (b/2); i++)
{
    // error happens here
    delete[] a[i];
}
delete[] a;

运行程序后,出现“检测到堆损坏”错误 - 粘贴打印屏幕: Error Printscreen

知道问题出在哪里吗?

谢谢。


更新

我正在发布调试器屏幕截图,发生在我收到错误之前。 (变量a的真名是“vkljucenost”:

Debugger Screenshot


更新

由于有人让我贴出更多代码,所以我贴出完整的功能代码:

int** CVaja3KruskalView::CalcKruskal(EnosSez* seznam, int dimenzijaMatr)
{
    int** rezultat; // results array
    int stRezultatov = 0; // number of connections
    rezultat = new int*[dimenzijaMatr-1];
    for(int i = 0; i < (dimenzijaMatr-1); i++)
    {
        rezultat[i] = new int[2]; // shranjujem p in q
        rezultat[i][0] = -1;
        rezultat[i][1] = -1;
    }

    int** vkljucenost;
    int* dolzVkljuc = new int[dimenzijaMatr/2]; // last list elements
    vkljucenost = new int*[dimenzijaMatr/2];
    for(int i = 0; i < (dimenzijaMatr/2); i++)
    {
        vkljucenost[i] = new int[dimenzijaMatr];
        dolzVkljuc[i] = -1; // the i-list is empty
    }

    EnosSez* tmp = seznam;
    int pVkljuc;
    int qVkljuc;
    while(tmp!=NULL)
    {
        pVkljuc=Vkljuceno(vkljucenost, dolzVkljuc, tmp->p, dimenzijaMatr);
        qVkljuc=Vkljuceno(vkljucenost, dolzVkljuc, tmp->q, dimenzijaMatr);

        if(pVkljuc==qVkljuc && pVkljuc != -1) 
        {} else if (pVkljuc!=qVkljuc && pVkljuc != -1 && qVkljuc != -1) 
            rezultat[stRezultatov][0] = tmp->p;
            rezultat[stRezultatov][1] = tmp->q;
            stRezultatov++;

            int prvi = min(pVkljuc,qVkljuc);
            int drugi = max(pVkljuc,qVkljuc);
            // prestavimo drugi seznam v prvega (seznama združimo)
            for(int i = 0; i <= dolzVkljuc[drugi]; i++)
            {
                vkljucenost[prvi][dolzVkljuc[prvi]] = vkljucenost[drugi][i];
                dolzVkljuc[prvi]++;
            }
            dolzVkljuc[drugi] = -1; // spraznemo drugi seznam
        } else if((pVkljuc != -1 && qVkljuc == -1) || (pVkljuc == -1 && qVkljuc != -1)) 
        {
            rezultat[stRezultatov][0] = tmp->p;
            rezultat[stRezultatov][1] = tmp->q;
            stRezultatov++;

            if(pVkljuc == -1)
            {
                vkljucenost[qVkljuc][dolzVkljuc[qVkljuc]] = tmp->p;
                dolzVkljuc[qVkljuc]++;
            } else
            {
                vkljucenost[pVkljuc][dolzVkljuc[pVkljuc]] = tmp->q;
                dolzVkljuc[pVkljuc]++;
            }
        } else 
        {
            rezultat[stRezultatov][0] = tmp->p;
            rezultat[stRezultatov][1] = tmp->q;
            stRezultatov++;

            int prviPrazen = 0; 
            while(dolzVkljuc[prviPrazen] > -1)
            {
                prviPrazen++;
            }
            dolzVkljuc[prviPrazen] = 2;
            vkljucenost[prviPrazen][0]=tmp->p;
            vkljucenost[prviPrazen][1]=tmp->q;
        }


        tmp=tmp->next;
    }

    //destruction
    delete[] dolzVkljuc;
    for(int i = 0; i < (dimenzijaMatr/2); i++)
    {
        // error happening here!!!
        delete[] vkljucenost[i];
    }
    delete[] vkljucenost;

    return rezultat;
}

最佳答案

正如评论中所建议的,问题出在其他代码中,而不是删除节点。我没有调试代码,但正如评论者所建议的那样,我使用了 std::vector 而不是数组——首先检查 vector 的使用实际上与使用数组具有相同的效率。

关于C++ - 删除二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13478447/

相关文章:

c++ - 是否可以使用#define 更改#include 文件名?

c++ - 哪些标识符可用于构造函数初始化列表中的 lambda

c++ - 具有两种不同数据类型的二维数组?

c++ - g++ 在宏上提示 "does not give a valid preprocessing token"而 vc++ 编译正常

c++ - 从 vc6 dll 创建 wstring 时出现错误指针或链接问题

c - Microsoft C/C++ 链接器优化未能丢弃未使用的代码/数据

c++ - 如何从 Lua C API 中的函数获取多个返回值?

c++ - 打印双向链表 - 无结果

c++ - 如何在 Microsoft Visual Studio C++ 中以 Windows XP 为目标

c++ - u_int32_t 是什么?