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