Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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++_Arrays_Pointers_New Operator_Delete Operator - Fatal编程技术网

C++ 使用另一个指针删除动态数组

C++ 使用另一个指针删除动态数组,c++,arrays,pointers,new-operator,delete-operator,C++,Arrays,Pointers,New Operator,Delete Operator,情况是: int main () { int *p1 = new int[50]; int *p2 = p1; ... 当我要删除阵列时,我会执行以下操作: delete[] p1; 我也可以这样做: delete[] p2; ?两个指针都指向同一个内存,因此在删除[]时可以使用其中一个。但只做一次,删除已经删除的内存是未定义的行为。因此,如果您执行删除[]p1则不能执行删除[]p2也可以是一个或另一个。两个指针都指向同一个内存,因此在删除[]时可以使用其中一个。但

情况是:

int main ()
{
    int *p1 = new int[50];
    int *p2 = p1;
    ...
当我要删除阵列时,我会执行以下操作:

delete[] p1;
我也可以这样做:

delete[] p2;

两个指针都指向同一个内存,因此在
删除[]
时可以使用其中一个。但只做一次,删除已经删除的内存是未定义的行为。因此,如果您执行
删除[]p1
则不能执行
删除[]p2
也可以是一个或另一个。

两个指针都指向同一个内存,因此在
删除[]
时可以使用其中一个。但只做一次,删除已经删除的内存是未定义的行为。因此,如果您执行
删除[]p1
则不能执行
删除[]p2
也可以是一个或另一个。

两个指针都指向同一个内存,因此在
删除[]
时可以使用其中一个。但只做一次,删除已经删除的内存是未定义的行为。因此,如果您执行
删除[]p1
则不能执行
删除[]p2
也可以是一个或另一个。

两个指针都指向同一个内存,因此在
删除[]
时可以使用其中一个。但只做一次,删除已经删除的内存是未定义的行为。因此,如果您执行
删除[]p1
则不能执行
删除[]p2,也可以是一个或另一个。

由于p2指向p1分配的同一内存块,因此可以使用p2擦除该内存块

您可以通过运行以下代码来验证这一点

#include <iostream>

using namespace std;

int main()
{
    int* p1 = new int[10];
    int* p2 = nullptr;

    for (int i = 0; i < 10; i++) {
        p1[i] = i * i;
    }

    // 1st run
    for (int i = 0; i < 10; i++) {
        cout << p1[i] << " ";
    }
    cout << endl;

    p2 = p1;

    if (p2 != nullptr) {
        delete p2;
    }   

    // 2nd run;
    for (int i = 0; i < 10; i++) {
        cout << p1[i] << " ";
    }

    p1 = nullptr;
    p2 = nullptr;

    return 0;
}
#包括
使用名称空间std;
int main()
{
int*p1=新的int[10];
int*p2=nullptr;
对于(int i=0;i<10;i++){
p1[i]=i*i;
}
//第一轮
对于(int i=0;i<10;i++){

cout由于p2指向p1分配的同一内存块,因此可以使用p2擦除该内存块

您可以通过运行以下代码来验证这一点

#include <iostream>

using namespace std;

int main()
{
    int* p1 = new int[10];
    int* p2 = nullptr;

    for (int i = 0; i < 10; i++) {
        p1[i] = i * i;
    }

    // 1st run
    for (int i = 0; i < 10; i++) {
        cout << p1[i] << " ";
    }
    cout << endl;

    p2 = p1;

    if (p2 != nullptr) {
        delete p2;
    }   

    // 2nd run;
    for (int i = 0; i < 10; i++) {
        cout << p1[i] << " ";
    }

    p1 = nullptr;
    p2 = nullptr;

    return 0;
}
#包括
使用名称空间std;
int main()
{
int*p1=新的int[10];
int*p2=nullptr;
对于(int i=0;i<10;i++){
p1[i]=i*i;
}
//第一轮
对于(int i=0;i<10;i++){

cout由于p2指向p1分配的同一内存块,因此可以使用p2擦除该内存块

您可以通过运行以下代码来验证这一点

#include <iostream>

using namespace std;

int main()
{
    int* p1 = new int[10];
    int* p2 = nullptr;

    for (int i = 0; i < 10; i++) {
        p1[i] = i * i;
    }

    // 1st run
    for (int i = 0; i < 10; i++) {
        cout << p1[i] << " ";
    }
    cout << endl;

    p2 = p1;

    if (p2 != nullptr) {
        delete p2;
    }   

    // 2nd run;
    for (int i = 0; i < 10; i++) {
        cout << p1[i] << " ";
    }

    p1 = nullptr;
    p2 = nullptr;

    return 0;
}
#包括
使用名称空间std;
int main()
{
int*p1=新的int[10];
int*p2=nullptr;
对于(int i=0;i<10;i++){
p1[i]=i*i;
}
//第一轮
对于(int i=0;i<10;i++){

cout由于p2指向p1分配的同一内存块,因此可以使用p2擦除该内存块

您可以通过运行以下代码来验证这一点

#include <iostream>

using namespace std;

int main()
{
    int* p1 = new int[10];
    int* p2 = nullptr;

    for (int i = 0; i < 10; i++) {
        p1[i] = i * i;
    }

    // 1st run
    for (int i = 0; i < 10; i++) {
        cout << p1[i] << " ";
    }
    cout << endl;

    p2 = p1;

    if (p2 != nullptr) {
        delete p2;
    }   

    // 2nd run;
    for (int i = 0; i < 10; i++) {
        cout << p1[i] << " ";
    }

    p1 = nullptr;
    p2 = nullptr;

    return 0;
}
#包括
使用名称空间std;
int main()
{
int*p1=新的int[10];
int*p2=nullptr;
对于(int i=0;i<10;i++){
p1[i]=i*i;
}
//第一轮
对于(int i=0;i<10;i++){

cout如果不深入研究细节,delete操作符的定义如下

delete expression
delete [ ] expression
正如您所见,它使用一个表达式(更准确地说是一个强制转换表达式)

int *p1 = new int[50];
int *p2 = p1 + 50;

delete [] ( p2 - 50 );
(请注意,必须将表达式p2-50括在括号中。)

对表达式求值,并将其值用作要删除的内存的地址


删除内存后,您可能无法访问它。否则,程序的行为将未定义。

如果不深入研究细节,删除运算符的定义如下所示

delete expression
delete [ ] expression
正如您所见,它使用一个表达式(更准确地说是一个强制转换表达式)

int *p1 = new int[50];
int *p2 = p1 + 50;

delete [] ( p2 - 50 );
(请注意,必须将表达式p2-50括在括号中。)

对表达式求值,并将其值用作要删除的内存的地址


删除内存后,您可能无法访问它。否则,程序的行为将未定义。

如果不深入研究细节,删除运算符的定义如下所示

delete expression
delete [ ] expression
正如您所见,它使用一个表达式(更准确地说是一个强制转换表达式)

int *p1 = new int[50];
int *p2 = p1 + 50;

delete [] ( p2 - 50 );
(请注意,必须将表达式p2-50括在括号中。)

对表达式求值,并将其值用作要删除的内存的地址


删除内存后,您可能无法访问它。否则,程序的行为将未定义。

如果不深入研究细节,删除运算符的定义如下所示

delete expression
delete [ ] expression
正如您所见,它使用一个表达式(更准确地说是一个强制转换表达式)

int *p1 = new int[50];
int *p2 = p1 + 50;

delete [] ( p2 - 50 );
(请注意,必须将表达式p2-50括在括号中。)

对表达式求值,并将其值用作要删除的内存的地址



删除内存后,您可能无法访问它。否则,程序的行为将无法定义。

是的,您可以。它们是相同的,不是吗?这就是将删除的指针设置为null的原因。非常感谢,我对这样一个快速的答案印象深刻:)@AngelinaJolly如果有多个指针都指向sa,那么它真的没有帮助内存不足。如果你忘记设置一个指向
nullptr
的指针怎么办?不幸的是,这是一个很容易犯的错误。@JoachimPileborg,这是个好消息。我真的不确定安吉丽娜·乔利的评论是什么意思。当我有多个指针时,在删除p1并将其设置为nullptr之后,我仍然会犯删除p1的错误p2:)是的,你可以。它们是一样的,不是吗?这就是将已删除指针设置为Null的由来非常感谢,我对这样一个快速的答案印象深刻:)@AngelinaJolly如果一个指针有多个指针都指向同一个内存,那真的没有帮助。如果你忘记将其中一个指针设置为
nullptr
,那会是一个非常容易的错误不幸