为什么调试器只显示我的数组指针中的一个元素?

时间:2012-03-12 17:12:07

标签: c++ visual-studio-2010 malloc new-operator

首先:我知道new是C ++的做法。我只是表明有不止一种方法可以重现这个错误,而且两者都非常令人沮丧。

我有两种形式的源文件。我正在尝试调试另一个编程任务,但我不是在寻求帮助。基本上,我正在尝试将set重新实现为具有大小字段和指向int数组的指针的类。以下是使用new的代码:

testnew.cpp

int main()
{
    int size = 1;
    int *elements = new int[size];
    elements[0] = 0;
    size++;
    int * temp = new int[size];
    for (int i = 0; i < (size - 1); i++)
    {
        temp[i] = elements[i];
    }
    delete[] elements;
    temp[size] = size;
    elements = temp;
    elements[1] = 1;
    delete[] elements;
}

再次使用不太优选的alloc函数:

testalloc.cpp

int main()
{
    int size = 1;
    int * elements = (int *) malloc(sizeof(int) * size);
    elements[0] = 0;
    size++;
    elements =(int *) realloc(elements,size * sizeof(int));
    elements[1] = 1;
    free(elements);
}

在这两种情况下,我的目标是创建一个数组,然后附加到它。但是,在这两种情况下,在Visual Studio 2010中构建并运行它之后,阵列根本不会增长,并且只有1个“槽”供我的项目进入。在VS的调试器中,我监视elements数组指针;附件是截图。两个版本的代码都是一样的。

My watches at the end of the program

- 断点位于delete[] / free()来电。

说真的,我做错了什么?这必须是一个逻辑错误,我已经梳理了malloc / reallocnew的四十几个例子,并阅读并重读了我的教科书,我可以看不出来有什么问题!

我觉得我应该有一条线将分配的内存分成一个数组,但new int[]调用不会这样做吗?

5 个答案:

答案 0 :(得分:5)

除了代码的任何其他问题,您必须执行Joe Gauterin提及并拥有多个手表,或设置这样的手表:

elements,5

将导致:

enter image description here

我不知道是否有VS2010的更新列表,但这仍然有效: Symbols for Watch Variables
和: View array in Visual Studio debugger?

答案 1 :(得分:4)

其他答案已经指出了代码中的错误(temp[size] = size;),但是您的混淆来自于您误读了调试器的输出。

就类型系统和调试器而言,elements不是数组,而是指针。调试器无法知道它是否是指向数组中第一个元素的指针或指向单个元素的指针。

如果您想在调试器中查看elements[x]的值,请使用表达式*(elements+x)

答案 2 :(得分:2)

在第一个例子中,这是错误的:

temp[size] = size;

这将转换为:

temp[2] = 2;

由于数组是零索引的,因此您在分配的区域之外写作。

答案 3 :(得分:1)

文件testnew.cppsize中的temp个元素分配内存,但随后设置temp[size],即size+1个元素。也许这应该是

temp[i] = size;

文件testalloc.cpp提交了将内存重新分配给同一个变量的常见错误,而没有验证对realloc的调用是否成功:

elements =(int *) realloc(elements,size * sizeof(int));

如果realloc失败,elements将设置为null,其原始内存将被孤立。

答案 4 :(得分:1)

首先,C ++被索引为0,因此temp[size] = size;是一个错误。要回答您的问题,元素的类型为int*。它实际上是一个数组,不是没有代码分析的VS可用的知识。所以,你需要做的是使用例如std :: vector&lt;&gt;,boost :: array或确保你的数组永远不会定义为int*