Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除数组指针的元素没有意义吗?_C++ - Fatal编程技术网

C++ 删除数组指针的元素没有意义吗?

C++ 删除数组指针的元素没有意义吗?,c++,C++,我知道我应该使用std::vector或其他替代方法,但我不理解指针 创建指针数组时: int* a = new int[100]; 它应该分配一个100*sizeof(int)的空间,不是吗 当我们不再需要它时,我们会: delete [] a; 1. : 但是,当我真的这样做时(在一个娱乐程序中有一次意外),似乎不会触发运行时错误(如下面第3部分中所述),并且程序正常运行(尽管可能存在内存泄漏)。为什么?它真的删除(释放)了数组的第一个元素吗 2. 根据,delete[]知道需要删除

我知道我应该使用
std::vector
或其他替代方法,但我不理解指针

创建指针数组时:

int* a = new int[100];
它应该分配一个
100*sizeof(int)
的空间,不是吗

当我们不再需要它时,我们会:

delete [] a;

1.

:

但是,当我真的这样做时(在一个娱乐程序中有一次意外),似乎不会触发运行时错误(如下面第3部分中所述),并且程序正常运行(尽管可能存在内存泄漏)。为什么?它真的删除(释放)了数组的第一个元素吗


2.

根据,
delete[]
知道需要删除的数组的大小

但是当我删除错误的东西时会发生什么呢?(它会导致运行时错误…在codepad.org上,它显示
内存在分配块之前被阻塞
,并且VS2010中的某个
调试断言失败
)。为什么不直接删除(释放)元素1到99

delete [] &a[1]; // or
delete [] (a + 1);

3.

下面的代码还显示了
内存在分配块之前被阻塞的情况。但是为什么它不删除(释放)元素99呢?为什么它会导致一个错误,而只是像第1部分那样删除一个
就不会了

delete &a[99]; //or
delete (a + 99);

《C++标准》实际上陈述了上述事情会发生什么情况?

为什么?它是否确实删除(释放)了数组的第一个元素?

不,从技术上讲,它导致了一种未定义的行为。这意味着任何事情都可能发生

使用
new
new[]
的规则非常简单:

  • 如果您使用了
    new
    ,您必须使用
    delete
    ,如果您使用
    new[]
    您必须使用
    delete[]
    解除分配
  • 您应该将
    new
    new[]
    返回的地址传递到
    delete
    delete[]
如果你不遵守规则,你最终会有未定义的行为

为什么会这样?

因为C++标准是这样说的。 该标准为您提供了通过动态内存分配来管理对象的生命周期和内存的功能,作为回报,您可以签订一份合同,以遵循标准要求的规则来获得该功能。
如果你违反了合同,你就会受到惩罚

总之,

“权力越大,责任越大”

为什么?它是否确实删除(释放)了数组的第一个元素?

不,从技术上讲,它导致了一种未定义的行为。这意味着任何事情都可能发生

使用
new
new[]
的规则非常简单:

  • 如果您使用了
    new
    ,您必须使用
    delete
    ,如果您使用
    new[]
    您必须使用
    delete[]
    解除分配
  • 您应该将
    new
    new[]
    返回的地址传递到
    delete
    delete[]
如果你不遵守规则,你最终会有未定义的行为

为什么会这样?

因为C++标准是这样说的。 该标准为您提供了通过动态内存分配来管理对象的生命周期和内存的功能,作为回报,您可以签订一份合同,以遵循标准要求的规则来获得该功能。
如果你违反了合同,你就会受到惩罚

总之,

“权力越大,责任越大”

< > >根据C++标准,删除< <代码> >新[]/COD>使用<代码>删除>代码>的对象是未定义的行为。任何事情都有可能发生——从“什么都没有”到让你的堆变得面目全非。在这样的情况下,说什么会被删除是没有意义的,因为它严重依赖于系统

  • 删除“错误的东西”是未定义的行为。通常,这会破坏堆,因为分配器的常见实现期望某些值恰好存储在您传递用于释放的地址之前。这绝不是一个标准,因此,任何事情都可能发生

  • 它不会删除元素99,因为它从未分配元素99:它分配了100个项目的数组,而不是单个
    int
    ;它希望您一次取消分配所有100个项目-您不能以任何其他方式取消分配

  • < > >根据C++标准,删除< <代码> >新[]/COD>使用<代码>删除>代码>的对象是未定义的行为。任何事情都有可能发生——从“什么都没有”到让你的堆变得面目全非。在这样的情况下,说什么会被删除是没有意义的,因为它严重依赖于系统

  • 删除“错误的东西”是未定义的行为。通常,这会破坏堆,因为分配器的常见实现期望某些值恰好存储在您传递用于释放的地址之前。这绝不是一个标准,因此,任何事情都可能发生

  • 它不会删除元素99,因为它从未分配元素99:它分配了100个项目的数组,而不是单个
    int
    ;它希望您一次取消分配所有100个项目-您不能以任何其他方式取消分配


  • 这些情况下的内存布局在某种程度上是由实现定义的。我们不应该把这些事情搞砸。使用错误的
    delete
    格式是错误的。就这么简单。至于1.,这是未定义的行为,因此它与此代码和此编译器一起工作,在其他3个编译器上尝试它,它可能会开始崩溃。所以,未定义的行为是对不遵循规则的事物的普遍解释?@AlvinWong:未定义的行为是一种例外情况,它
    delete &a[99]; //or
    delete (a + 99);