删除静态/动态指针后无法重新分配内存

时间:2018-01-04 19:08:04

标签: c++

我读过cpprefrence:

  

删除释放先前由匹配运算符分配的存储空间   新。

但是在这里,我只得到3.4作为输出而不是2.1。

#include <iostream>
int main(){
    float x, y; x = y = 0;
    float * p = &x;
    *p = 3.4;
    std::cout << *p;
    delete p; //Can I deallocate memory of a static pointer?
    p = &y;
    *p = 2.1;
    std::cout << *p;
    delete p;
    return 0;
}

更新:我已在此处添加了运算符new,但代码仍未提供预期结果。

int main(){
    float *p = new float(3.4);
    float x, y; x = y = 0;
    p = &x;
    *p = 3.4;
    cout << *p;
    delete p; //Deallocate the memory of p pointer.
    p = &y; //Shouldn't this line reallocate the memory to p? or maybe &p = &y;
    *p = 2.1;
    cout << *p;
    delete p;
    return 0;
}

我们的老师告诉我们找到一个解决方法,以便在删除poitner后仍能设置指针所指向的值

int main(){
    float *p = new float(3.4);
    delete p; // We want to delete the pointer but change the value of *p afterwards.
    *p = 2.1;
    std::cout << *p;
}

2 个答案:

答案 0 :(得分:3)

从你的帖子:

  

删除先前由匹配运算符new分配的释放存储空间。

使用时:

float x, y; x = y = 0;
float * p = &x;
delete p;

你没有遵循这个陈述。

p未指向由operator new分配的对象。它指向堆栈上的局部变量。

使用更新的代码,您确实通过调用new来分配内存,但是您更改了p,以便它指向堆栈上的变量。

float *p = new float(3.4);  // p points to object returned by new
float x, y; x = y = 0;
p = &x;                     // p points to x. The previous memory is leaked

因此,

  1. 您的程序有内存泄漏。
  2. 执行delete p;时,您的程序仍然会受到未定义的行为。
  3.   

    修复以下代码的解决方案是什么。

    解决方案1 ​​请勿在行p之后使用delete p;,因为它不是有效指针,因为它不是。

    解决方案2 分配新内存,将其分配给p,然后再使用p

    int main(){
      float *p = new float(3.4);
      delete p; // I need to delete p right at this part of code.
    
      p = new float; // Allocate new memory
      *p = 2.1;
      std::cout << *p;
      delete p;      // Deallocate the memory before program ends
    }
    

答案 1 :(得分:0)

您正在尝试删除自动分配的变量(通常在堆栈中)。运算符 delete 仅适用于动态分配的变量(通常在堆中)。有堆栈内存管理的库,但是每次它们超出范围时,让编译器自行解除所有自动分配的变量是一个很好的做法。