【问题标题】:Delete operator memory management [duplicate]删除操作员内存管理[重复]
【发布时间】:2013-06-25 19:16:41
【问题描述】:

我正在尝试了解 C++ 中的内存管理。
这是我的代码:

 Person *P5 = new Person();
 delete P5;
 std::cout<<P5->getWeight()<<std::endl;
 delete P5;
 std::cout<<P5->getWeight()<<std::endl;

我的第一个 cout 有效,第二个无效,因为我之前都使用了 delete。谁能解释一下?

【问题讨论】:

  • 您可能遇到了未定义的行为
  • 你的最后三行调用了 UB。
  • 删除后为什么要打印出来
  • 这很简单。如果您告诉操作系统您不再使用内存,那么您就不要使用它。无论如何,你不能保证任何事情。

标签: c++ memory-management


【解决方案1】:
delete P5;
std::cout<<P5->getWeight()<<std::endl; // 1
delete P5;                             // 2
std::cout<<P5->getWeight()<<std::endl; // 3
  1. 您正在尝试取消引用指向已实现内存的指针。这是未定义的行为。什么事情都可能发生。

  2. 您正在尝试释放已释放的内存。这是未定义的行为。任何事情都有可能发生。

  3. goto1

【讨论】:

    【解决方案2】:

    cout 都不能保证对您有用,因为您使用的是已删除的对象。
    只是有时候,当你删除一些东西时,内存并没有被覆盖,数据还在。但是下次分配内存时可能会重复使用它。
    当你这样做时

     Person *P5 = new Person();
     delete P5;
    

    p5 是一个悬空指针。只是在delete之后不要使用它

    【讨论】:

      猜你喜欢
      • 2016-11-02
      • 1970-01-01
      • 2015-11-01
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 2021-08-03
      相关资源
      最近更新 更多