【问题标题】:Pointer delete C++ [duplicate]指针删除 C++ [重复]
【发布时间】:2021-04-29 08:44:04
【问题描述】:

我在删除代码中的指针时遇到问题。

这是代码:

int *x=new int; 

int a=5;

x=&a;

cout << *x << endl;
delete x;
cout << *x;

你为什么不删除指针,然后悄悄地打印第二个 cout?

【问题讨论】:

  • 如果删除指针,如何访问该位置?因此第二个cout &lt;&lt; *x; 会抛出错误无效访问!
  • 这能回答你的问题吗? Deleting a pointer in C++
  • 您的 delete x; 行无效 - 您已将不同的值重新分配给指针(a 的地址) new 行之后,所以您有丢失了该分配返回的地址。
  • delete 不会删除指针,它会删除指针指向的对象,并且该对象必须是用new 创建的。在您说x = &amp;a 之后,x 不再指向这样的对象,而是指向具有自动存储功能的对象,并且将这样的指针传递给delete 具有未定义的行为。

标签: c++ pointers


【解决方案1】:

您的代码有几个问题,因此无法正常工作。

首先,delete 运算符不会删除指针本身,但会释放指针变量所指向的内容。换句话说,

int* p = new int();
cout << *p << endl; // this prints 0
cout << p << endl; // this prints 0x84544550 on my machine

从上面的例子可以看出区别:p是指针的值,在我的机器上指向内存地址0x84544550,而*p表示去偏移量0x84544550读从那里得到一个整数值(4 个字节)。根据 `new() 运算符',该值为 0。

然后,你表演的那一刻

x=&a;

您正在将指针值(在我的情况下为0x84544550)更改为局部变量的地址:现在,灾难是您正在考虑引用您之前分配的东西,但实际上是您没有的东西' t.

随后的delete x 调用只会尝试释放该内存,而不是您原来的int 变量。

您在分配指针时必须小心,因为您应该保留语义,否则您最终会遇到令人讨厌的错误。

看看更全面的解释:Deleting a pointer in C++

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-28
    • 2011-12-21
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多