【问题标题】:C++ call delete does not free memory? [duplicate]C++调用delete不释放内存? [复制]
【发布时间】:2015-10-26 07:21:01
【问题描述】:

我想测试一下c++中的delete能做什么,所以写了如下:

#include <iostream>
#include <vector>

using namespace std;

class A{
public:
  A(string s):a(s){}
  string getS(){
    return a;
  }
private:
  string a;
};

class B{
public:
  B(string str):s(str){}
  void setV(A a){
    v.push_back(a);
  }
  string getS(){
    return s;
  }
private:
  vector<A> v;
  string s;
};

int main(){
  A a("abc");
  B* b = new B("cba");
  b->setV(a);
  cout<<b->getS()<<endl;
  cout<<a.getS()<<endl;
  delete b;
  cout<<b->getS()<<endl;
  cout<<a.getS()<<endl;
  return 0;
}

我仍然得到以下输出:

cba
abc
cba 
abc

看起来我仍然可以访问 a 和 b 的内存? 所以我的问题是 1.为什么我可以访问b,因为我已经调用了delete? 2.为什么我可以访问a,因为调用了b的析构函数,所以包含a的向量的内存应该是空闲的?

干杯

【问题讨论】:

  • 重复问题。您通过访问已删除的内存来调用“未定义的行为”。
  • 未定义的行为是未定义的。您并没有从计算机中物理删除字节 - 您只是放弃了所有权。

标签: c++ memory-management destructor


【解决方案1】:

free 函数不会清除或清零内存。它只是让它成为一个空闲块,准备好被内存管理器分配。

指针和结构都持有相同的值,当被引用时会产生未定义的行为。抛出异常/错误或检索内部信息。

【讨论】:

    【解决方案2】:

    1.为什么我可以访问b,因为我已经对它调用了delete?

    它是Undefined Behavior,所以一切皆有可能。它可能会工作,也可能不会,可能会出错,可能会出现段错误,可能会崩溃等等。

    2.为什么我可以访问a,因为b的析构函数被调用,所以包含a的向量的内存应该是空闲的?

    a 在调用b-&gt;setV(a); 时被复制,所以b 中的vectora 无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多