新操作员未检测到错误

时间:2014-03-21 17:53:31

标签: c++ pointers new-operator

我在试图理解指针和操作员“新”

时一直在搞乱

我最终对这两个代码应该导致的内容更加困惑,这是另一个但不是,所以我想了解这里发生了什么。 提前谢谢。

#include <iostream>
using namespace std;
int main()
{
    int * p = new int(50);
    p[1] = 33;
    cout  << *p << endl;
}

Output: 50

当我尝试这个时

#include <iostream>
using namespace std;
int main()
{
    int * p = new int[50];
    p[1] = 33;
    cout  << *p << endl;
}

Output: -842150451

我想知道每个结果的含义。

4 个答案:

答案 0 :(得分:3)

在第一个中,您动态创建了一个值为50的int。当您尝试分配值33时,实际上将其分配给不属于您的内存。这是未定义的行为。但是当你打印它时,你打印出你创造的原始值,即50。

在第二个中,您动态创建了一个50 int的数组。然后,您已指定数组中的第二个值应为33. *因此,当您使用cout << *p << endl;打印该值时,您最终只会打印第一个未定义的值。再试一次,你可能会得到另一个价值。

*编辑:正如评论中所指出的,我应该更明确地说明这一点。数组从0开始。因此,如果要访问第一个值p[0],则会执行此操作。

答案 1 :(得分:3)

在第一种情况下

int * p = new int(50);  // allocates 1 int on heap, initialized to value of 50
p[ 1] = 33;             // p gives you the address of integer, 
                        // p[1] moves the p pointer forward and accessing 
                        // the pointed object results in undefined behavior,
                        // this means that at this moment anything can happen
                        // exception, crash, home war, nothing, everything,
                        // printing garbage value as well

在第二种情况下:

int* p = new int[50];   // allocates 50 ints on heap, uninitialized
p[ 1] = 17;             // initializes element with index 1 to value of 17
std::cout << *p;        // p gives you the address of first element, with index 0
                        // which is still uninitialized, thus prints garbages

你应该使用

int* p = new int[50]();

将int初始化为0。

答案 2 :(得分:0)

在第一种情况下,您要创建一个包含50个整数的数组,为数组中的SECOND int赋值,然后打印数组中的第一个元素。数组索引从0开始,所以当你在cout语句中取消引用指针时,它会打印出在索引0的内存中发生的任何事情。

在第二种情况下,您要创建一个整数,并使用值50初始化它。当您取消引用print语句中的指针时,您将获得刚刚创建的整数。当您访问未分配的内存时,p [1] = 33可能会或可能不会导致错误。

答案 3 :(得分:0)

int* p = new int[50];
  • 在堆上分配一个int数组,其中包含50个未初始化的元素,范围从索引0到49。 将p [1]设置为33不会改变p [0],这是您使用“ cout&lt;&lt; * p ”打印的内容。

值-842150451(十六进制 0xCDCDCDCD )是一个幻数“由Microsoft的C ++调试运行时库用于标记未初始化的堆内存”,请参阅{{3} }。

int* p = new int(50);
  • 在堆上准确分配一个int并使用值50初始化它,因此之后设置p [1]会导致未定义的行为,因为您没有在p [1]所指的位置分配该内存。

我建议您使用this question on SO来查看在逐步执行代码时分配的内存会发生什么。