C++ 具有运行时分配的指针

C++ 具有运行时分配的指针,c++,C++,我不明白为什么将值重新指定给*p会显示错误。我们已经删除了它在运行时创建的资源 int a = 7, b = 8; int *p = new int; *p = a; cout<<*p<<" "<<p<<endl; delete p; cout<<*p<<" "<<p; *p = &b; // error cout<<"\n"<<*p<<" "<&

我不明白为什么将值重新指定给*p会显示错误。我们已经删除了它在运行时创建的资源

int a = 7, b = 8;
int *p = new int;
*p = a;
cout<<*p<<" "<<p<<endl;
delete p;
cout<<*p<<" "<<p;
*p = &b;         // error
cout<<"\n"<<*p<<" "<<p;
inta=7,b=8;
int*p=新的int;
*p=a;

cout除了删除指针而不给它一个新地址之外,问题是当前您正试图将
p
指针的值分配给int的内存地址

  • 调用
    delete p后取消引用
    p
    的行为未定义。不要那样做。这很简单。现在来看更难的一点:调用
    delete
    后读取
    p
    值(更不用说取消引用)的行为也未定义!所以也不要这样做。(非正式地将指针放回未初始化状态。)

  • *p=&b是一个输入错误。您需要
    p=&b
    将指针
    p
    分配到
    b
    的地址。如果您修复了该输入错误,您可以自由读取
    p
    的值并再次取消引用


  • *p
    是一个
    int
    ,你的意思是
    p=&b
    还是
    *p=b
    *p
    删除p之后
    是UB。@S.M.这是另一个问题,但错误是因为赋值不正确。
    p=&b
    将是有效的,但是尝试将
    b
    的地址分配给
    *p
    ,例如,如果没有强制转换,则不支持指向
    int
    的指针,在这种情况下,由于
    *p
    不再存在,将导致未定义的行为。