2012-03-12 70 views
2

首先:我知道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()通话。

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

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

回答

1

文件testnew.cpp分配内存在tempsize元素,但随后设置temp[size],这是size+1元件。也许这应该是

temp[i] = size; 

文件testalloc.cpp承诺重新分配存储到同一个变量的常见错误,而不验证thte到realloc调用成功:

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

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

2

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

temp[size] = size; 

这将转化为:

temp[2] = 2; 

而且因为数组是零索引你的分配区域以外书写。

+0

啊!诅咒零索引。那最终成了我的问题,我知道这是事实,但我对调试器的经验不足让我失望。 – Tasuret 2012-03-12 17:32:38

4

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

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

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

+0

你也可以在调试器中放入'elements [x]'。 – crashmstr 2012-03-12 17:30:12

+0

就是这样。你的逻辑很好,这是输出被误解了。 – 2012-03-12 17:56:50

1

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

相关问题