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

时间:2015-11-03 11:47:03

标签: c++ arrays pointers new-operator delete-operator

情况是:

let maxLen = Math.max.apply(null, arrays.map(v => v.length)), out = [];

当我想要删除我的数组时,我会这样做:

int main ()
{
    int *p1 = new int[50];
    int *p2 = p1;
    ...

我也可以这样做:

delete[] p1;

3 个答案:

答案 0 :(得分:4)

两个指针都指向同一个内存,因此您可以在delete[]时使用其中一个。但只执行一次,删除已删除的内存是未定义的行为。因此,如果您执行delete[] p1;,那么您也无法delete[] p2;执行mysql_num_rows()

答案 1 :(得分:0)

如果不深入研究详细信息,删除操作符的定义将按以下方式进行查看

delete expression
delete [ ] expression

正如您所看到的,它使用了一个表达式(更准确地说是一个强制转换表达式)。例如,你可以写

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

delete [] ( p2 - 50 );

(请注意,您必须用括号表达式p2 - 50括起来。)

计算表达式,并将其值用作要删除的内存的地址。

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

答案 2 :(得分:-1)

由于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;
}

第二次运行p1数组显示该数组的内容已被delete p2操作删除,该操作放在if语句中以确保安全。

一旦使用完毕,可以将两个指针放在一边,将它们等同于nullptr关键字。