C++ 无法删除指针
我只是在用关键字C++ 无法删除指针,c++,pointers,C++,Pointers,我只是在用关键字new和delete学习指针和动态内存分配 下面是我的C++代码来测试我的理解。 #include <iostream> using namespace std; int main() { // Variable to be pointed to by a pointer cout << "Create a double variable" << endl; double n = 3.1415926; cou
new
和delete
学习指针和动态内存分配
下面是我的C++代码来测试我的理解。
#include <iostream>
using namespace std;
int main() {
// Variable to be pointed to by a pointer
cout << "Create a double variable" << endl;
double n = 3.1415926;
cout << "n = " << n << endl;
cout << "&n = " << &n << endl << endl;
// Dynamic memory allocation
cout << "Dynamically allocate memory to a pointer" << endl;
double * ptr = new double;
ptr = &n; // Error when delete ptr
// *ptr = n; // Can delete ptr
cout << "ptr = " << ptr << endl;
cout << "*ptr = " << *ptr << endl << endl;
// Free the pointer memory
cout << "Delete the pointer" << endl;
delete ptr;
cout << "Done" << endl;
return 0;
}
但当指针按如下方式分配时:*ptr=n
。没有发生这样的错误。此外,ptr
指向0x7faa7e400630
的地址,该地址不是n
我的理解是,ptr
在这两种情况下都是有效的指针(带有有效地址)。但是我不知道为什么delete ptr
在ptr=&n
的情况下不起作用。任何有助于我理解的帮助都将不胜感激。谢谢
但是我不知道为什么delete ptr不适用于ptr=&n
n
是一个自动变量。删除自动变量的地址具有未定义的行为
delete
任何指针上的表达式(非放置)new
表达式返回的指针除外)具有未定义的行为(空指针除外;删除空指针是安全的)。这就是指定语言的方式。当行为未定义时,程序可能会产生错误
ptr=&n
为new
返回的值赋值。由于该值不再存储在任何位置,因此将无法删除它。这称为内存泄漏
但当指针按如下方式分配时:*ptr=n
。没有发生这样的错误
*
是间接运算符。该表达式不指定指针ptr
仍指向动态存储中的对象。它不指向n
<代码>删除指针上的表达式是由新表达式返回的具有定义良好的行为。其行为是销毁对象并释放内存
此赋值设置由ptr
指向的对象的值。该数字的值现在与n
变量的值相同
但当指针按如下方式分配时:*ptr=n
。没有发生这样的错误
执行*ptr=n
时,指针不会被删除。这是一个简单的赋值操作<代码>ptr指向有效内存。因此,分配给*ptr
不是问题
但是我不知道为什么delete ptr不适用于ptr=&n
您只能
删除通过new
获得的内容<代码>&n
不是这样的指针。执行delete ptr
与执行delete&n
相同。这是不正确的,是未定义行为的原因。double*ptr=new double;ptr=&n代码>--这是内存泄漏,因为您通过覆盖ptr
而丢弃了new
返回给您的指针。另外,放置一个cout
$ ./test
Create a double variable
n = 3.14159
&n = 0x7ffee304f830
Dynamically allocate memory to a pointer
ptr = 0x7ffee304f830
*ptr = 3.14159
Delete the pointer
test(2436,0x118bf05c0) malloc: *** error for object 0x7ffee304f830: pointer being freed was not allocated
test(2436,0x118bf05c0) malloc: *** set a breakpoint in malloc_error_break to debug
Abort trap: 6