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
,那会是一个非常容易的错误不幸