【问题标题】:After deleting a dynamic array, some values of its bound do NOT change. Why? [duplicate]删除动态数组后,其边界的某些值不会改变。为什么? [复制]
【发布时间】:2019-10-28 17:02:45
【问题描述】:

在 c/c++ 中:

delete操作符用于删除一个动态数组,但是使用delete操作符删除一个数组后,再打印出来,有些值还是一样的。为什么?- 我希望这些值是垃圾。

#include <iostream>
using namespace std;

int main()
{
    int n=5;
    int*A=new int[n];

    for (int i=0;i<n;i++)
       A[i]=i+1;

    delete [] A; //deleting 'A' array

    for (int i=0;i<n;i++)
       printf("%d ",A[i]);

}

输出将是:

0 0 3 4 5

如果我们删除delete [] A;,输出将是:

1 2 3 4 5

假设数组的元素应该有垃圾值,为什么数组的某些值仍然相同?

【问题讨论】:

    标签: c++ c arrays pointers dynamic-memory-allocation


    【解决方案1】:

    您的代码在释放错误后可以访问。如果你修复了这个错误,谜团就会消失。真的就是这么简单。

    【讨论】:

    • 我该如何解决?
    • @AbdulrhmanAboghanima - 通过从不访问你已经释放的内存。
    • @AbdulrhmanAboghanima 您可以删除delete[] 调用,也可以删除对A[i] 的访问权限。但在你这样做之前,你的编译器不需要让你的程序以任何特定的方式运行。
    • 虽然正确,但这个答案并不能真正回答所提出的问题。 OP 显然意识到了该错误(通过预期垃圾),并想了解为什么该错误不会产生“预期”结果(垃圾),而不是如何修复它或正确执行它。
    • @AbdulrhmanAboghanima 当你在 C++ 中做非法的事情时,任何事情都可能发生。 “任何”包括“仅覆盖部分数据”。无法保证您会读取垃圾 - 它可能是原始数据,可能被部分或随机覆盖,或者可能是垃圾,或者可能是段错误,根本不执行您的代码,执行 other 您没有要求的代码等... 要了解编译器决定对您的代码执行什么操作,请inspect/debug(逐步执行)您的程序的程序集。不要期望未定义行为的确切行为。
    猜你喜欢
    • 1970-01-01
    • 2011-10-10
    • 2015-05-12
    • 2017-07-21
    • 2020-04-08
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 2021-02-04
    相关资源
    最近更新 更多